LoginSignup
8
5

More than 3 years have passed since last update.

gem Sidekiqの導入

Posted at

Sidekiqとは?

非同期処理を実行する時に使用するgemです。公式ドキュメント(の日本語訳)によると、得られるメリットはこちら。

Rubyのシンプルで効率的なバックグラウンド処理。 Sidekiqはスレッドを使用して、同じプロセスで同時に多くのジョブを処理します。 Railsは必要ありませんが、Railsと緊密に統合され、バックグラウンド処理が非常に簡単になります。

今回は、Railsの課題を実施していく中でsidekiqを使いましょうとの指定があったので、それに沿って実装をしていきます。

非同期処理とは?

そもそも「非同期処理」というものがよく分かっていなかったのですが、こちらの記事で丁寧に解説されていました。

簡単に言ってしまえば時間のかかる処理を、通常の処理とは別に、「あとで処理しますよリスト」に登録すること。要はあるタスクを実行している間に他のタスクを実行できる、ということ。逆は"同期処理"とよばれ、あるタスクが実行されている間、他のタスクはできない。

時間のかかる処理の例: メール送信・ファイルのダウンロード・アップロードなど

なるほどです。。。。。なお、非同期処理を行うことのメリットは、こちらの記事によると「複数のジョブを同時に実行することにより、メモリを節約すること可能です。」だそうです。

そういえば、公式サイトにはパフォーマンスに関する記述が情報に大きく書いてありますね。。。
Image from Gyazo

ちなみに、同様の働きをするGem(?)に、

  • Delayed Job
  • Resque

などがあるらしいです。

導入

さて、導入です。まず、Gemfileに以下のように記載し、

Gemfile
gem 'sidekiq'

bundle installします。

次に、config/application.rbに下記のように設定します。

config/application.rb
module YourAppName
  class Application < Rails::Application
    # 中略
    config.active_job.queue_adapter = :sidekiq
  end
end

こちらは、Railsガイドに記載の手順に従っています。Railsガイドの同部分の記述によると、

Active Jobには、Sidekiq、Resque、Delayed Jobなどさまざまなキューイングバックエンドに接続できるアダプタがビルトインで用意されています。

とのことなので、Rails側で公式的にSidekiqとの接続をサポートしているので、上記のような短い記述で接続の設定ができるのかしらと理解しました。

さまざまな使い方

導入は以上のようにシンプルなのですが、では、一体何にどう使えば良いのでしょうか?

公式のwikiにはさまざまな記述がありますが、今回は、取り組んでいるRails課題の使い方に沿ってredisを使ってjobとオプションのデータを保存する方法について取り組んでいこうと思います。

Redisにジョブを保存する

まず、config/initializers/sidekiq.rbを作成し、以下のように記載します。

config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://localhost:6379' }
end

Sidekiq.configure_client do |config|
  config.redis = { url: 'redis://localhost:6379' }
end

ポイントは、Redisの場所を特定するのにSidekiq.configure_serverブロックとSidekiq.configure_clientブロックの両方を定義することです。

また、sidekiqはデフォルトでlocalhost:6379にアクセスしてRedisに接続しようとしますが、本番環境ではこれはうまくいかないので、別の設定をしてねということが公式サイト該当ページのトップに書いてありました。

オプションを設定する

また、今回は下記のオプションを設定しました。

config/sidekiq.yml
:concurrency: 25
:queues:
  - default
  - mailers

なぜこのような形式になるのかは、このQiita記事で丁寧に解説されていました。

ポイントは、

  • sidekiqのオプションはyml形式で指定し
  • デフォルトではconfig/sidekiq.ymlないにに設置する

そして、今回はconcurrency(並行性:同時処理できる件数(?))を25、queues:(キューの実行順)を、default, mailers の順に実施しています。

起動

ここで、一度起動させてみます。config以下に書いた設定コマンドを、以下のコマンドを実行します(参考:Railsで非同期処理を行える「Sidekiq」)

$ bundle exec sidekiq -C config/sidekiq.yml

無事、起動しました!
Image from Gyazo

確認画面で見る

sidekiqの稼働状況を画面で確認するために、routes.rbに以下のように記載します。

config/routes.rb
require 'sidekiq/web'

Rails.application.routes.draw do

  if Rails.env.development?
    mount Sidekiq::Web, at: '/sidekiq'
  end
end

これで、/sidekiqにアクセスすることで確認画面が見られるようになりました!
Image from Gyazo

今回は、メール通知が送信されるアクションをsidekiq管理下においたのですが、メール送信の結果、きちんとダッシュボードに反応が示されています^^

完了&感想

以上で実装は終わりです。非常に簡単でしたが、

  • まだまだ非同期処理を実行しなければならない規模のアプリを作ったことがない
  • メインである(?)ジョブを作る動作についてまだ何もやれていない

ので、実務で使うにはもう少し学習が必要そうです。
ですが、バックエンドの深いところに入ってきたかな?という感じがあるので、引き続き学習を深めていきたいと思います。

8
5
0

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
8
5