話題の記事

[Ruby on Rails] Sidekiq で非同期処理を実装する

2013.03.07

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

Sidekiq とは

Sidekiq とは Rails アプリで非同期処理を行うためのライブラリです。複数のジョブを同時に実行することができ、メモリを節約することができます。
ということで今回は Sidekiq の基本と使いかたをざっくりと学んでいきたいと思います。

Sidekiq を使ってみる

インストール

まず前提条件として Redis が必要なのでインストールしましょう。Redis はジョブの管理に使われています。

brew install redis

インストールは Gemfile に追加して bundle install するだけです!

vim Gemfile # gem 'sidekiq' を追加
bundle install

Worker を実装する

非同期処理を行うクラスは Sidekiq::Worker を include してつくります。あとは perform メソッドの中に非同期で行いたい処理を書くだけです。引数は自由に追加して OK です。

app/workers/hard_worker.rb

class HardWorker
  include Sidekiq::Worker
  def perform(name, count)
    puts 'Doing hard work: name=' + name + ', count=' + count.to_s
  end
end

この Worker は以下のように呼び出します。

HardWorker.perform_async('Classmethod', 1)

起動する

実際に動かしてみましょう。まずは以下のコマンドで Sidekiq のコンソールを起動します。

bundle exec sidekiq

あとは Worker を呼び出してみます。

bundle exec rails c
Loading development environment (Rails 3.2.12)
irb(main):002:0> HardWorker.perform_async('Classmethod', 1)

Sidekiq コンソールに出力されました!

2013-03-07T06:51:41Z 6339 TID-ox29aw7a8 INFO: Booting Sidekiq 2.6.5 with Redis at redis://localhost:6379/0
2013-03-07T06:51:41Z 6339 TID-ox29aw7a8 INFO: Running in ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin12.2.0]
2013-03-07T06:51:41Z 6339 TID-ox29aw7a8 INFO: See LICENSE and the LGPL-3.0 for licensing details.
2013-03-07T06:51:41Z 6339 TID-ox29aw7a8 INFO: Starting processing, hit Ctrl-C to stop
2013-03-07T06:51:51Z 6339 TID-ox29m4c7w HardWorker JID-e4089dd40a829ccffeda65cd INFO: start
Doing hard work: name=Classmethod, count=1
2013-03-07T06:51:51Z 6339 TID-ox29m4c7w HardWorker JID-e4089dd40a829ccffeda65cd INFO: done: 0.0 sec

時間差で実行

以下のようにスケジュールしたタイミングで Worker を実行させることもできます。

HardWorker.perform_in(3.hours, 'Classmethod', 1)

これは3時間後に実行する設定です。perform_in メソッドで使っていた引数は第二引数以降に設定します。また Sidekiq はスケジュールされたジョブをデフォルトでは 15 秒間隔で確認しにいきます。もっと短い周期で確認したい場合は以下ように書きます。

Sidekiq.configure_server do |config|
  config.poll_interval = 5
end

また、スケジュールしたジョブをすべてクリアしたい場合は以下のように書きます。

Sidekiq::ScheduledSet.new.clear

ブラウザから監視する

Sidekiq のジョブをブラウザから監視するツールを使ってみましょう。まずは Gemfile を編集し、以下を追加します。

Gemfile

gem 'slim'
gem 'sinatra', '>= 1.3.0', :require => nil

次にブラウザから監視できるよう routes.rb を編集します。

require 'sidekiq/web'
mount Sidekiq::Web => '/sidekiq'

以上で完了です!アプリを起動させてブラウザからアクセスしてみましょう。

bundle exec rails s

sidekiq_monitoring

まとめ

Sidekiq を使った非同期処理の実装方法を紹介しました。難しいところは特にないので、導入しやすいとおもいます。動作もサクサクで良い感じですね。
ということで、時間のかかる処理は Sidekiq におまかせしましょう!