shoryuken gemで簡単にSQSを使ったJob Queue WorkerをRailsに作成する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

丹内です。
掲題のとおり、SQSを簡単に使うことができるshoryuken gemを使ってみました。

前提

  • ruby 2.2.4
  • rails 4.2.5

マネジメントコンソールでSQSの作成

AWSマネジメントコンソールのSQS画面から新規にキューを作成します。

スクリーンショット_2016-02-22_16_11_51

Shoryukenによる負荷が抑えられるよう、Receive Message Wait Timeの設定を忘れないようにしてください。

インストール

Gemfileに以下のように書いてbundle installします。

gem 'shoryuken'

group :development, :test do
  gem 'foreman'
end

あとで解説しますが、railsアプリとは別にworkerプロセスも立ち上げるので、便利になるようforemn gemもインストールしています。

Jobクラスを作成

Shoryuken::Workerをincludeしたクラスを作成します。

$ bundle exec rails g job sample --queue shoryuken

これで作成されるapp/jobs/sample_job.rbに、以下のようなクラスを作成します。

class SampleJob
  include Shoryuken::Worker

  shoryuken_options queue: 'sample', auto_delete: true, body_parser: :json

  def perform(message, data)
    # ここに処理を記述する。
    # body_parserにjsonを指定しているのでdata['name']のようにすぐアクセスできる
  end
end

shoryuken gemの設定ファイルを追加

どのキューに接続するかなどの設定をYAMLファイルに記載して、config/shoryuken.ymlに保存します。
このファイル名には規約はなく、workerプロセスを立ち上げるコマンド(bundle exec shoryuken)でファイルを指定します。

aws:
  access_key_id: <%= ENV["AWS_ACCESS_KEY_ID"] %>
  secret_access_key: <%= ENV["AWS_SECRET_ACCESS_KEY"] %>
  region: <%= ENV["AWS_REGION"] %>
concurrency: 1
queues:
  - sample

この設定ファイルの場合、環境変数からクレデンシャル等を持ってくるので、別途direnvなどを使って設定しておきます。
参考:direnv で特定のディレクトリ下の環境変数を定義する

foremanで起動するように修正

foreman gemは開発時に複数プロセスを簡単に立ち上げることができる便利なgemです。
RAILS_ROOTにProcfileという名前でファイルを作成すると、foreman startで全てを起動してくれます。

app: rm tmp/pids/server.pid; bundle exec rails s -b 0.0.0.0 -e development
worker: bundle exec shoryuken -R -C config/shoryuken.yml

動作確認

コマンドラインからforemanを立ち上げます。

$ bundle exec shoryuken -R -C config/shoryuken.yml
2016-02-13T12:11:17Z 46415 TID-ovlxy1tkw INFO: Rails environment loaded
I, [2016-02-13T21:11:17.408108 #46415]  INFO -- : Celluloid 0.17.3 is running in BACKPORTED mode. [ http://git.io/vJf3J ]
2016-02-13T12:11:17Z 46415 TID-ovlz6t15s INFO: Starting

マネジメントコンソールからSQSにJSONメッセージを入れると、workerのログイに以下のように出ます。

2016-02-13T12:15:40Z 46415 TID-ovly43cho INFO: Found 1 messages for 'sample'
2016-02-13T12:15:40Z 46415 TID-ovlxyskcw SampleJob/sample/949770f5-93b5-41d8-80eb-f24f0f069480 INFO: started at 2016-02-13 21:15:40 +0900
2016-02-13T12:15:40Z 46415 TID-ovlxyskcw SampleJob/sample/949770f5-93b5-41d8-80eb-f24f0f069480 INFO: completed in: 672.6569999999999 ms

auto_delete: trueを設定しているので、workerの処理が正常に完了したらちゃんとSQSからも消えてます。

まとめ

SQSを使って簡単にJob Queue Workerを作れるshoryuken gemをご紹介しました。
ActiveJobにも対応しているようですし、AWS上で動くRailsアプリを作成するときには必須のgemだと思いました!

参考URL

  • https://github.com/phstc/shoryuken
  • http://qiita.com/iemon7stars/items/d4efdd8872d287906d29