Rails + Sidekiq + Redisの使い方
開発環境で Sidekiq と Redis を接続して Sidekiq が動作することを確認します。
macOS Monterey v12.4
ruby 3.0.0
rails 6.1.6.1
今回、Message モデルを保存する POST リクエストを送った後、Sidekiq を走らせ日時を更新することができるかどうか確認します。
モデル作成
$ rails g model Message
migration ファイル作成
Sidekiq でsidekiq_executed_time
というカラムを更新します
class CreateMessages < ActiveRecord::Migration[6.1]
def change
create_table :messages do |t|
t.string :body
t.datetime :sidekiq_executed_time
t.timestamps
end
end
end
テーブル作成
$ rails db:migrate
コントローラー作成
$ bundle exec rails generate controller Messages
以下のように POST リクエストを受けるメッセージコントローラーを記述します
sidekiq_executed_time
をパラメーターとして送信せずに Sidekiq で更新するようにします。
class MessagesController < ApplicationController
def new
@message = Message.new
end
def create
@message = Message.new(message_params)
@message.save!
# ここでJobを実行する。
end
private
def message_params
params.require(:message).permit(:body)
end
end
ルーティング追加
require 'sidekiq/web'
Rails.application.routes.draw do
root to: 'messages#new'
resources :messages
mount Sidekiq::Web => '/sidekiq'
end
Message コントローラーにリクエストを送るフォームを追加。
これでフォームから Message を保存できる
<h1>Message#new</h1>
<p>Find me in app/views/message/new.html.erb</p>
<%= form_with(model: @message, local: true) do |f| %>
<%= f.label :body %>
<%= f.text_field :body %>
<%= f.submit%>
<% end %>
gem を Gemfile に追加
gem 'redis', '~> 4.7', '>= 4.7.1'
gem 'sidekiq'
インストール
$ bundle install
アダプターを sidekiq にする
config.active_job.queue_adapter = :sidekiq
Sidekiq の設定ファイルを追加
:concurrency: 5
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
production:
:concurrency: 5
:queues:
- default
:daemon: true
redis の起動を以下のコマンドで確認
# 起動
$ redis-server
# 接続(起動した時と別ターミナルで実行)
$ redis-cli
# 値の設置
127.0.0.1:6379> SET mykey "Hello"
OK
127.0.0.1:6379> GET mykey
"Hello"
redis の起動が確認できた。
次に Sidekiq から接続する redis の url を設定する
Sidekiq.configure_server do |config|
config.redis = { url: 'redis://localhost:6379' }
end
Sidekiq.configure_client do |config|
config.redis = { url: 'redis://localhost:6379' }
end
実行するジョブを作成する
$ rails g job sample
class SampleJob < ApplicationJob
queue_as :default
def perform(*args)
Message.find_each do |message|
message.update(sidekiq_executed_time: DateTime.current)
end
end
end
コントローラーにジョブを実行する処理追加
class MessagesController < ApplicationController
def new
@message = Message.new
end
def create
@message = Message.new(message_params)
@message.save!
# 追加
SampleJob.perform_later
end
private
def message_params
params.require(:message).permit(:body)
end
end
Rails と redis を起動した状態で と sidekiq を起動。
$ sidekiq -C config/sidekiq.yml
作成した Message フォームで送信するとメッセージインスタンスの sidekiq_executed_time が更新されていて、Sidekiq が動いているのが確認できた。
何か連絡をしたい際は以下 SNS、メールでお願いいたします。
Twitter: https://twitter.com/naka_ryo_z
見出しへのリンク