読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

Heroku上で遅延タスクを実行するには

辞書Twitter連携をちゃんと動かすべく、調査を行いました。

一般論
  • ウェブアプリケーションは通常、ウェブプロセス、バックグラウンドプロセス、cronプロセスを使って実装する。時間のかかる処理、時間が不定な処理(他のウェブサイトへのアクセス)などはバックグラウンドプロセスを使う。定期的な巡回などはcronプロセスを使う。
Heroku
  • プラットフォームAspen, BambooでバックグラウンドプロセスDelayed Job(後述)をサポート。
  • 新プラットフォームCeladon Cedar(以下Cedar)にて新しいプロセスモデルを導入。任意のバックグラウンドプロセスをサポート。
  • 月にdyno(プロセスに対応する課金リソース単位) 750時間分がフリー。worker dyno 1, web dyno 0にすれば一応ウェブプロセスとバックグラウンドプロセスをただで試すことができる。
    • リソースの変更をすると、無料でもクレジットカード情報の入力を求められるのに少し抵抗が。
  • web dynoは0に設定しないと、アイドリング状態でも1時間分課金されるという記載があったので、1時間でサスペンドすると思われる。
Celadon Cedar
  • Cedarでは2種類のプロセスタイプweb, workerでこれを管理する。
  • 管理にはProcfileを使用する。
  • Rubyの場合、パッケージ依存管理Bundlerの使用が必須。
Rubyのバックグラウンドプロセスの選択肢
  • Delayed Job: 元々はRails用(ActiveRecord使用)ジョブキュープロセス。今はDataMapper/Mongoid/MongoMapper/Redisに対応。
  • Resque: データストアRedisを使用したRubyジョブキュープロセス。resque-schedulerというフロントエンドあり。
  • beanstalkd: Cで書かれた高速ジョブキュープロセス。StalkerというRuby IFあり。

SQLデータベースをジョブキューに使うのはオーバーヘッドが大きいことから、データストアや専用ジョブキューが開発されている流れのようです。


オプションが多いと比較に時間が取られます。(楽しようとして時間を使ってしまうのは悩ましいところです。)週末あれこれ迷った後、パフォーマンスの問題はないことから、今回は、PostrgreSQL+ActiveRecord+Delayed Jobで行こうかと決めてみました。