sidekiqをDockerで使ってみる

Ruby

sidekiqとは?

sidekiqのことを簡単に言うと、「バックグラウンド処理をしてくれるもの」という認識を持っていれば大丈夫です。

利用するタイミングとしては、例えば重い処理を先にバックグラウンドで実行して次の処理をさせたいときに利用します。

使うタイミングをもっとわかりやすく!

使うタイミングをもっとわかりやすく説明します。

例えば、ボタンを押すとwebサイトのPVの集計処理をしてくれるシステムがあるとします。

sidekiqを使わないと…

  1. ボタンを押す
  2. 集計処理が走る
  3. 処理が終わるまでずっとローディング(この間、何も操作できない)
  4. 処理が終わったら、完了メッセージ表示
クローバー
クローバー

処理が終わるまで待つのは辛いよ。。。

処理が長い場合、最悪タイムアウトになってしまう可能性もありますよね。

sidekiqを使うと。。。

  1. ボタンを押す
  2. 集計処理が走る
  3. 色々操作
  4. 処理が終わったら、完了メッセージ表示
クローバー
クローバー

処理が走っている間、待機する必要がないからストレスフリーだね!

sidekiqを使わないときは集計処理中ずっと待機しなくちゃいけなかったのが、sidekiqを使えば集計処理中でも違う操作ができるようになるというメリットがあります。

dockerでsidekiqを使うための初期設定

docker.compose.ymlにworkerとRedisを追加

sidekiqはRedisで動かす必要があるので、docker.compse.ymlにRedisの情報を追加してあげます。

また、workerコンテナを作って上げると、compose後にsidekiqが勝手に動いてくれます。

worker:
    build: .
    environment:
      - "RAILS_ENV=development"
      - "REDIS_URL=redis://redis:6379"
    volumes:
      - ".:/myapp"
    depends_on:
      - redis
    command: bundle exec sidekiq
redis:
  image: redis:6.0.9
  command: redis-server --appendonly yes
  ports:
    - 6379:6379

gemの追加

gem 'sidekiq'

redis.ymlの追加

config/redis.ymlを新たに作成し、中身を以下の通りにします。

default: &default
  db:
    sidekiq: 0
    # cache:   1
    # session: 2

development:
  <<: *default
  host: redis

test:
  <<: *default
  host: redis

sidekiq.ymlの追加

config/sidekiq.ymlを追加します。

:verbose: false
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:concurrency: 10
:queues:
  - default
  - test

route.rbに追加

route.rbに以下の2行を追加

require 'sidekiq/web'
mount Sidekiq::Web, at: "/sidekiq"

application.rbに追加

config/application.rbに以下のものを追加

module ActiveJobExample
  class Application < Rails::Application
    config.active_job.queue_adapter = :sidekiq
  end
end

sidekiq.rbの追加

config/initializers/sidekiq.rbを作成し、以下のコードを追加

redis_config = YAML.load_file('config/redis.yml')[Rails.env]
redis_config['db'] = redis_config['db']['sidekiq']

Sidekiq.configure_server do |config|
  config.redis = {
    url: "redis://#{redis_config['host']}/#{redis_config['db']}"
  }
end

Sidekiq.configure_client do |config|
  config.redis = {
    url: "redis://#{redis_config['host']}/#{redis_config['db']}"
  }
end

ページの作成

sidekiqを使うためにページを作成します。

sidekiq_sample/index.erb

<%= button_to "ジョブを実行", sidekiq_sample_index_path, {method: :post}%>

sidekiq_sample_controller.rb

class SidekiqSampleController < ApplicationController
  def index
  end

  def create
    GreetWorker.perform_in(30.seconds, "実行しました")
    render template: "sidekiq_sample/index"
  end
end

workers/greet_worker.rb

class GreetWorker < ApplicationController
  include Sidekiq::Worker
  sidekiq_options queue: :test, retry: 5

  def perform(string)
    p "#{string}"
  end
end

実際に使ってみる

`localhost:ポート番号/sidekiq_sample`にアクセスすると上記のようなボタンがあるので、2~3回ほど押してみましょう。

次に`localhost:ポート番号/sidekiq/scheduled`にアクセスしてみると、下記のような画面が表示されます。

これがまだ実行されていないジョブとなります。

この状態で少し待ってみると、ターミナルに以下のようなものが出力されます。

以上がDockerでsidekiqを使う方法です。

クローバー
クローバー

参考にしてみてね!

参考にした記事

Docker で Redis + Sidekiq を実装する
現場でSidekiqを扱う事になったので、Dockerでの環境構築と、簡単な使い方を記録します。SidekiqとはSidekiqはRailsで非同期処理を簡単に行えるようにするためのgemです。Sidekiq使用場面としては以下が考えられま

コメント