【Celery】Celery 要件と環境編
ソーシャルゲームとバッチサーバー
ソーシャルゲームには、バッチキューサーバーがかなり重要かと思います。
そのへん、みなさんどうやってるんでしょうね‥
あまり話に上がらないです。
ソーシャルゲームで求められる要件としては、こんな感じでしょうか。
時間指定で予約実行出来る。
レイドボスの終了処理や、イベントのランキング集計など、積み上げ型のキューバッチシステムではなく、時間指定で任意の処理を行う必要があります。
冗長性
バッチサーバーが死ぬと一大事です。レイドボスが終わらなかったりしかねません。サーバーを2重化するなど、冗長性の確保が必要です。
スケールアウト
負荷が増大してきた時、スケールアップでも良いんですが、サーバーを付け足せば負荷対策できるのがベストです。
積み上げ型のキューシステムはいくつかあるのですが、上記のような要件に答えてくれそうなシステムがなかなか見つかりませんでした。
(探し方が悪かったのかもですが)
Celery
そこで見つけたのがpythonで作られたキューシステム「Celery」です。
- BROKERというキューを保持する入れ物から、Workerがキューを取り出し処理します。
- BROKERは、RabbitMQ、Redisなどから選択できます。
- Workerは複数同時に起動出来ます。また複数サーバーで立ち上げることも出来ます。
- 処理結果は、失敗・成功等のステータスを付けて保持出来ます。
- キューは「flower」というGUI環境で確認出来ます。
他にもタスクの連鎖設定など多くの機能があるようですが、あまり日本語の資料が見つからなかったのでインストールして調査してみました。
システム環境と試してみたい事
今回試した環境と、試してみたい事です。
OSはCentOS 6.4 64bit。(vagrantで構築)
vagrant、便利ですね。
BROKERはRedisで行う。
RabbitMQってのがよく知らないので、Redisを使います。
/var/celery 以下にスクリプト一式を格納する。
エラー発生時は、自動リトライは行わず、管理者にメールで知らせる。
Celeryは自動リトライの機能を持っていますが、業務では「バッチの失敗=重大なエラー」かと思います。リトライの設定は行わず、管理者にメールで知らせるようにしてみます。
celorydの冗長性を確保する。(複数サーバーでのworker実行)
2台のサーバーで動かして、1台殺してもうまくキューを処理出来るのか確認してみます。
celorydがスケールアウト出来るようにする。(workerサーバーの追加)
1台サーバーで動かしてるところに、2台目を追加してみます。
【Celery】Celery 要件と環境編
【Celery】Celery インストール、Worker立ち上げ編
【Celery】Celery アプリ・タスクの定義編
【Celery】Celery タスクの追加とflower編
【Celery】Celery Task Status編
【Celery】Celery 結果をmysqlに格納する編
【Celery】Celery 複数サーバーでworkerを立ち上げてみる編
【Celery】Celery 感想編