PyCon JP 2012参加レポート

第2回 17歳のVPS構築記,Python3の最新情報からソーシャルゲーム,WebフレームワークとPythonの話

この記事を読むのに必要な時間:およそ 4.5 分

Python3でここまで出来るWebプログラミング

ビープラウドの小田切篤さんによるセッションです。

Python 2とPython 3の違い

Python 3の現在の安定版はPython3.2.3で,セッションの翌週9月22日にPython 3.3.0 finalがリリース予定でした(しかし9月29日に延期されました⁠⁠。

Python 3のPython 2との大きな違いとして,以下の3点が挙げられました。

標準ライブラリが整理されたこと
標準ライブラリの統廃合があり,importパスが変わりました
str型がbytes型に,unicode 型がstr型に変わったこと
互いを直接結合できなくなりました
str型とbytes型の違いが明確になり,str型は文字列としてのみ,bytes型は生データとしてのみ扱われるようになりました
bytes型で文字列のフォーマットを使えなくなりました
相対importの扱いが変わったこと
相対モジュールのimportで"from ."が必要になりました

これらの変更により,Python 2向けに書かれた既存のライブラリが動かなくなります。筆者自身も,Python 3対応を謳っているライブラリがbytes型の扱い誤っているために動かない事例に遭遇し,バグ報告をした経験があります。

講演者の小田切さん

講演者の小田切さん

WebフレームワークのPython3対応の遅れ

PythonにはWebフレームワーク(またはWebアプリケーション)とWebサーバ間のやり取りを定義する規格であるWSGIがあります。WSGI 1.0では,特に文字コードとユニコード関連の仕様に曖昧な点がありました。これがbytes型とstr型の違いが明確になったPython 3にWebフレームワークが対応する障害となっていましたが,Python 3.2 がリリースされた頃に公開されたWSGIのバージョン1.0.1で明確に定義されたことで,WebフレームワークのPython 3対応が進むようになりました。

Webアプリケーションを作るうえで必要なもの

小田切氏はWebアプリケーションを作る上でとりあえず必要だと思うものと,そのソリューションとして以下を挙げました。

リクエストオブジェクト
→Python 3ではWebObが使えます
ルーティング
ルーティング単体で用意されたものはなかなかなく,探すのに苦労しました
Python 2とPython 3両対応で自分で作りました
  • →WebDispatch
HTMLテンプレート
WSGI 1.0.1 が定義される前からテンプレートエンジンのPython 3対応は進んでいました
知っているテンプレートエンジンの半分以上がPython 3対応していました
  • →Jinja2
  • →Mako
  • →Chameleon
  • →Tempita
WSGIサーバ
staticファイルはどうせNginxでやりますが,開発中にNginxを使うのも萎えます
  • →webob.FileApp, webob.DirectoryApp

まとめ

各レイヤのライブラリがPython 3対応してきていて,それぞれのレイヤーでPython 3対応されたライブラリが全く無いという状況は無いと思います。

しかし,画像処理に関して難があります。PIL は非公式パッチによってPython 3.2で動くようですが,公式にはPILやpillowがまだPython 3対応されていません。

ただ,結局はWebフレームワークを利用してWebアプリケーションを実装していく事になると思うので,Django待ちですね,と言ってセッションを締めくくりました。

筆者は以前Python 3対応を済ませているPyramidというフレームワークを使い,Python 3でWebアプリケーションの作成を試みたことがありました。しかし,Python 3に対応したデータベースドライバを見つけることができずに断念しました。

各レイヤのライブラリのPython 3対応が着々と進んでいるとのお話でしたので,もうしばらくすれば本格的にPython 3でアプリケーションを開発できるようになるのかな,と感じました。また,Python 3はPython 2よりも優れているので,Python 3でアプリケーションが開発できるようになることを待ち望んでいます。

ソーシャルゲームとメッセージキュー

株式会社gumiの幾田 雅仁氏によるセッションです。

メッセージキューの役割

メッセージキューはポイントからポイントに安全かつ非同期にメッセージを送る役割を果たします。ポイントとは何らかの計算実体で,スレッドだったり,プロセスだったり,ノードだったりします。

講演者の幾田さん

講演者の幾田さん

メッセージキューの仕組み

ポイントとポイントの間にメッセージを流す役割をするブローカーがあります。ブローカーは内部にキューを持っていて,ポイントが送ったメッセージはこのキューにためられます。そして,このメッセージが別のポイントに配送されます。

メッセージ送信時,送信側はブローカー内部のキューにメッセージを追加する処理だけをすればよいので,受信側の状態に関係なくメッセージを送ることができます。

送信されるすべてのメッセージが一旦キューに貯められるので,メッセージ送受信を非同期化することができ,また信頼性も向上します。

メッセージキューの利用場面

実際にソーシャルゲームでメッセージキューを利用しているのか,と言うと課金処理と分割されたDBへの並行処理に利用しているそうです。

課金処理

GREEのプラットフォームでゲームを提供する場合,アプリは課金のリクエストを受け取ってから5秒以内にレスポンスを返さないと,その課金自体が無効になるという制約があるため,レスポンスを返すまでに5秒以上かかってしまうと,ユーザーにアイテムを提供したにもかかわらずその代金が受け取れない状態になってしまうのだそうです。

しかし時間がかかる処理はどうしても発生するため,そこでメッセージキューを利用して変則的なRPCを実現し,ユーザにリダイレクトレスポンスを返したあとで,バックグラウンドでレスポンスを処理し,その結果をユーザに返すそうです。

分割されたDBへの並行処理

ユーザ毎にDBを水平分割しているそうですが,トランザクションを用いずに複数のDBに同じクエリを投げたい場合,パッチ処理をしたい場合に,データベースごとにキューを作って,キューの下に複数のワーカーをぶら下げてこれを実現しているそうです。

まとめ

筆者自身,メッセージキューのKestrelとNoSQLデータベースのMongoDBを用いた非同期処理システムをPyCon JP 2012開催の2週間前ほどに実装していたことから個人的にホットな話題で,とても興味深くお話を伺う事ができました。

筆者が製作したシステムは個人的なプロダクト用の小規模なものでしたが,実際のソーシャルゲームの現場で使われている大規模な実例や運用方法を知ることができて勉強になりました。

著者プロフィール

吉田昂平(よしだこうへい)

高校2年生。小学6年生の時に同級生からウェブサイト制作を依頼されたことからプログラミングの世界に足を踏み入れる。得意とする言語はPython。PyCon JP 2012では,「ナウでヤングな17歳のVPS構築記」というタイトルでセッションをしたことに加え,運営スタッフも務めた。

URL:http://yosida95.com/

Twitter:@yosida95