まぁそうだろうとは思っていたのですが、とりあえず試してみたので書いときます。
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に追加。
1 | gem 'sucker_punch' |
そしてインストール
1 | bundle install |
そして、設定のinitializersでsucker_punchをqueue_adapterに指定。
1 2 3 | Rails.application.configure do config.active_job.queue_adapter = :sucker_punch end |
ジョブの作成を行います。
1 | rails g job foo |
これでJobが作成されます。
1 2 3 4 5 6 7 | class FooJob < ActiveJob::Base queue_as :default def perform(*args) # Do something later end end |
ジョブの非同期実行は以下のようにします。コントローラーなどから呼び出します。
1 | FooJob.perform_later() |
重たい処理をHeroku上でsucker_punch経由で実行してみた
結論から言うと、Herokuの30秒ルールで強制終了して終わりました。そりゃそうだよねー(涙目)
30秒以内に収まる処理の場合は普通に実行できたので、サービス的にバックグラウンド処理が大したことない場合は、sucker_punchで代用するというのはアリだと思います。