
本運用が始まったシステムで、それが何らかのバックグラウンド実行するジョブとかタスクとかを持つようなサービスの場合、ちょっとだけコードを変更したいんだよなーってことは良くあるが、実際変更したものに差し替えるとなると心臓に悪いものだ。
rask を使うと、こっそり止めて、上司に怒られないうちに復帰させるバックグラウンド処理を記述することができる。
本来バックグラウンド実行のためにタスク処理は必須ではないのだが、いわゆるタスク処理として、処理を細分化するように設計すれば、本当の意味でいつでも止められるようになる。タスクの粒度を下げれば下げるほど中断開始から中断されるまでの時間は短縮される。
使えるケース
最近のwebアプリとかだと、外部サイトから裏でごそごそ何か集めてきて結果を返すみたいなことが多いと思うのだけど、通信相手の応答速度なんて気まぐれなので、ブラウザがタイムアウトして、プロセスが中断されてしまい「あれ、どこまで宿題やったっけ」みたいなこと、よく起こる。おまけに、ユーザーも怒る。
そんなときに、バックグラウンドに処理を引き渡して、web には、「処理が完了するまでお待ちください」ってやっておけば、とりあえず安心だ。
ステートマシンなので、実行状態を監視できるというのもメリットだ。何%進んだか? なんてのを状態として仕込んでおけば、良くあるプログレスバーみたいなのをリアルに表現できる。タスクが終わったかどうかも、webでリロードするたびに確認できるようになる。
ちなみに、rask上に記述したコードのバグでとまって状態が飛んだら、
それはテスト不足です![]()
webで時間のかかるバックグラウンド処理を動かそうとすると、httpのタイムアウトに間に合わず、処理が完了しないみたいな問題を解決するために、タスクのライブラリを作った。
http://github.com/mewlist/Rask
gem install rask
で、インストールできます。
ノンブロッキング用途のみではなく、タスク処理を扱うための基本的な機能を備えているので、ほかの用途でも使えるはず。
できることがドキュメント以上にあるのですが、まとまった時間ができたときにでも、また話題に。