Sucker Punchとは
Sucker Punchは、Rails4.2に導入されたActiveJobから利用可能な、非同期処理をおこなうためのgemです。
通常、Herokuで非同期処理を行う場合は、Webサーバ用のwebプロセスとは別に、workerプロセスを起動し、バックグラウンドで非同期処理を行います。しかし、この場合だとworkerプロセスはHerokuの無料枠の対象とはならず、1月で約$35程度の費用が発生します。
しかし、Sucker Punchを使って非同期処理をおこなうようにすると、workerプロセスを別途起動することなく、webプロセスのみで非同期処理がおこなえますので、無料枠内に抑えることができます。
メリット
- workerプロセスを別途作る必要がないので、Herokuの無料枠で運用できる。
デメリット
- delayed_jobなどのように、ジョブを永続化していないので、再実行ができない。
- 「非同期処理を10分後に実行」といったパターンに対応していない。つまり即時実行のみ。
参考:https://github.com/brandonhilkert/sucker_punch/issues/97
導入
まずはGemfileにsucker_punchを記述します。
gem 'sucker_punch'
その後bundle installしておきましょう。次にActiveJobからsucker_punchを利用できるように、以下のようなファイルを作成します。
Rails.application.configure do
config.active_job.queue_adapter = :sucker_punch
end
ジョブの作成と実行
ジョブの作成はrailsコマンドから
rails g job My
とすると、app/jobs/MyJob.rbが生成されます。
class MyJob < ActiveJob::Base
queue_as :default
def perform(*args)
# Do something later
end
end
あとはperformメソッド内に非同期で実行したい処理の内容を記述します。
このジョブを実行するには、例えばコントローラーなどから
MyJob.perform_later
# 引数をセットする場合は以下のようにする
# MyJob.perform_later('hoge')
とすれば、ジョブが非同期で実行されます。