top_logo

Rails + Sidekiq + Redisの使い方

2022年 07月 26日

開発環境で 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

Messages コントローラ作成


コントローラー作成

$ bundle exec rails generate controller Messages

以下のように POST リクエストを受けるメッセージコントローラーを記述します


sidekiq_executed_timeをパラメーターとして送信せずに Sidekiq で更新するようにします。

app/controllers/messages_controller.rb
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

ルーティング追加

ルーティング追加

config/routes.rb
require 'sidekiq/web'
Rails.application.routes.draw do
  root to: 'messages#new'
  resources :messages
  mount Sidekiq::Web => '/sidekiq'
end

フォーム追加

Message コントローラーにリクエストを送るフォームを追加。

これでフォームから Message を保存できる

app/views/messages/new.html.erb
<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 %>

Redis と Sidekiq インストール

gem を Gemfile に追加

gem 'redis', '~> 4.7', '>= 4.7.1'
gem 'sidekiq'

インストール


$ bundle install

Sidekiq の設定

アダプターを sidekiq にする

config/application.rb
config.active_job.queue_adapter = :sidekiq

Sidekiq の設定ファイルを追加

config/sidekiq.yml
:concurrency: 5
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
production:
  :concurrency: 5
:queues:
  - default
:daemon: true

Redis の起動確認

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 を設定する

config/initializes/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

Job 作成

実行するジョブを作成する

$ rails g job sample
app/jobs/sample_job.rb
class SampleJob < ApplicationJob
  queue_as :default

  def perform(*args)
    Message.find_each do |message|
      message.update(sidekiq_executed_time: DateTime.current)
    end
  end
end

コントローラーにジョブを実行する処理追加

app/controllers/messages_controller.rb
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

Github:  https://github.com/ryotaro-tenya0727

メール:   ryotaro123110@gmail.com

見出しへのリンク

© 2024, written by Nakayama

Powered by Gatsby