非同期処理には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に外出しできるので絶対的に便利。