sidekiqとは?
sidekiqのことを簡単に言うと、「バックグラウンド処理をしてくれるもの」という認識を持っていれば大丈夫です。
利用するタイミングとしては、例えば重い処理を先にバックグラウンドで実行して次の処理をさせたいときに利用します。
使うタイミングをもっとわかりやすく!
使うタイミングをもっとわかりやすく説明します。
例えば、ボタンを押すとwebサイトのPVの集計処理をしてくれるシステムがあるとします。
sidekiqを使わないと…
- ボタンを押す
- 集計処理が走る
- 処理が終わるまでずっとローディング(この間、何も操作できない)
- 処理が終わったら、完了メッセージ表示
処理が終わるまで待つのは辛いよ。。。
処理が長い場合、最悪タイムアウトになってしまう可能性もありますよね。
sidekiqを使うと。。。
- ボタンを押す
- 集計処理が走る
- 色々操作
- 処理が終わったら、完了メッセージ表示
処理が走っている間、待機する必要がないからストレスフリーだね!
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を使う方法です。
参考にしてみてね!
参考にした記事
コメント