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

[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 におまかせしましょう!

この記事をシェアする

FacebookHatena blogX

関連記事