sucker_punchを使ってもHerokuの30秒超えはできない

まぁそうだろうとは思っていたのですが、とりあえず試してみたので書いときます。

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で代用するというのはアリだと思います。


カテゴリー Ruby, Ruby on Rails | タグ | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です