非同期処理にはWorkling

Ajaxで非同期に処理をキックして、一定間隔でその進捗を確認して…というのを書く必要があったのでBackgrounDRbを試してみたら、どうも使いにくかった。理由としては、

  • MetaWorkerのサブクラスでワーカを実装したのに、MiddleMan.workerで呼び出したときにはRailsWorkerProxyにすり替わっている
  • キューイングはしないのに、キューイングのためのテーブルを作らないとエラーが出る
  • 名前が好きじゃない
  • 引数のハッシュに:workerが妙に出て来て冗長
  • RSpecでテストしづらい(できなくはない)
  • APIがよくわからない

後半はなんだか個人的な理由だけど、とにかく調べるのに疲れたわりに、あまり実り多い感じではなかった。

で、その代わりに見つけたのがWorkling。これは非同期に処理を呼び出すためのプラグイン。サンプルは、githubのREADMEの通りなので特に書かない。

キューイングサーバが必要ならばStarlingと組み合わせる。これはTwitterでの利用実績もあるらしい

ただ注意する必要があるのは、進捗を保存しておくサンプルでWorkling::Return::Store::MemoryReturnStoreが利用されてるけど、これはそのプロセス内でのみ有効という点(ただのハッシュに値を保存してるだけ)。なので、バックグランドで進行中のところをAjaxで見に行く場合などにはその値にはアクセスできない。別途memcacheなどに値を保存しておく必要がある。

もしかしたらWorkling::Return::Store::StarlingReturnStoreを使えばいいのかもしれないけど、Starlingはキューイングのサーバだしなぁと詳しく把握しきれていなかったので、とりあえずmemcacheに直でアクセスするものを自分で追加した

追記1

調べてみたところ、StarlingReturnStoreはキューと関係なくただ単にmemcacheをラップしてるだけ(より正確には、StarlingReturnStoreはWorkling::Clients::MemcacheQueueClientをラップしていて、こいつはMemCacheを使ってconfig/workling.ymlで設定されたmemcacheサーバと接続してデータのやりとりをしてる)。

なのでStarlingReturnStoreを使うのが手軽で、接続先memcacheサーバの設定をworkling.ymlに外出しできるので絶対的に便利。