LoginSignup
33
28

More than 5 years have passed since last update.

Sucker Punchを使ってHerokuでタダで非同期処理を行う

Last updated at Posted at 2015-02-12

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を記述します。

Gemfile
gem 'sucker_punch'

その後bundle installしておきましょう。次にActiveJobからsucker_punchを利用できるように、以下のようなファイルを作成します。

config/initializers/sukcer_punch.rb
Rails.application.configure do
  config.active_job.queue_adapter = :sucker_punch
end

ジョブの作成と実行

ジョブの作成はrailsコマンドから

rails g job My

とすると、app/jobs/MyJob.rbが生成されます。

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')

とすれば、ジョブが非同期で実行されます。

33
28
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
28