まぁそうだろうとは思っていたのですが、とりあえず試してみたので書いときます。
sucker_punchとは?
sucker_punchとは非同期処理用のライブラリ(gem)で、特別なものを必要とせずに動作してくれます。メール送信程度の処理を非同期でやりたいということならば、sucker_punchで十分だと思います。
なんで使おうと思ったか
結論から書くと経費の節約のためです。私が開発しているサービスはHerokuで運用しているのですが、Herokuで非同期処理を行おうと思ったら、worker dynoを立ち上げなければなりません。worker dynoは1つでも月々$34.5するので、今の価格だと約4,140円します。これは痛い。なので、worker dynoを使わずに重たい処理をする方法はないか?と調べていたところ、sucker_punchの存在を知ったのです。
使い方(Rails4.2)
Rails4.2を使っているので、ActiveJobのqueue_adapterとしてsucker_punchを使ってみました。
まずはsucker_punchをGemfileに追加。
gem 'sucker_punch'
そしてインストール
bundle install
そして、設定のinitializersでsucker_punchをqueue_adapterに指定。
Rails.application.configure do config.active_job.queue_adapter = :sucker_punch end
ジョブの作成を行います。
rails g job foo
これでJobが作成されます。
class FooJob < ActiveJob::Base queue_as :default def perform(*args) # Do something later end end
ジョブの非同期実行は以下のようにします。コントローラーなどから呼び出します。
FooJob.perform_later()
重たい処理をHeroku上でsucker_punch経由で実行してみた
結論から言うと、Herokuの30秒ルールで強制終了して終わりました。そりゃそうだよねー(涙目)
30秒以内に収まる処理の場合は普通に実行できたので、サービス的にバックグラウンド処理が大したことない場合は、sucker_punchで代用するというのはアリだと思います。