【rails】非同期処理の準備 redisとsidekiqのインストール

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

メール送付は不安定な処理

前回after_create :send_emailにより、フォロー関係が作られたときにメール送信されるようにした

ただメール送信の処理はけっこう不安定なので、メール送信に失敗してフォローも失敗してしまうことがある

  1. createafter_create :send_mailcommit
    この流れでインスタンスが作成される(同期処理
  2. send_mailが失敗するとcommitできない

そのため、メールを非同期処理にする

よく失敗する処理、時間のかかる処理は非同期処理にすることが多い


非同期処理とは

これはJavaScriptだけど、今回はRailsで非同期処理をする


Railsでの非同期処理

非同期処理の考え方は以下のとおり

名前意味
Job
(ジョブ)
タスクのようなもの。非同期処理したい事柄のこと。
Worker
(ワーカー)
Jobを処理していくもの。労働者。
Queue
(キュー)
Jobが蓄積されているところ。箱のようなもの。

Redisとは

  • Redisはデータベースの一種
  • Railsでは非同期処理する際に使うことが多い
  • Jobの内容を保存・保管してくれる

Redisをインストール

brew install redis

無事にインストール完了(バージョン指定がうまく出来なかったことが心配)


Redisサーバーを立ち上げる

redis-server

こちらもスムーズに完了

サーバーを停止したいときはCtrl+cで終了できる

完全にシャットダウンさせるなら↓を実行する

redis-cli shutdown

Active Job

Railsが用意してくれているActive Jobを使うと、非同期処理が簡単にできる

使うために必要なライブラリを追加していく


sidekiq

sidekiqをインストールするため、Gemfileを開く

gem 'sidekiq', '6.0.5'

開発環境、本番環境どちらでも使うので上の方に追加する

※講義の内容に合わせてバージョン指定

sidekiqがあるとActive Jobが動く

bundle install

sidekiqを指定する

config/application.rbを開く

起動時に読み込みたい、アプリケーションの設定を書いておく

config.active_job.queue_adapter = :sidekiq

Active Jobでsidekiqを使うため、指定しておく


redisを指定する

config/initializers/sidekiq.rbのファイルを作成する

Sidekiq.configure_server do |config|
  config.redis = { url: ENV.fetch('REDIS_URL', 'redis://localhost:6379') }
end

Sidekiq.configure_client do |config|
  config.redis = { url:ENV.fetch('REDIS_URL', 'redis://localhost:6379') }
end

redisのserverの場所を指定している

ENV.fetch(環境変数に似ている)
  1. ENVに「REDIS_URL」のキーがあればその値を使う
  2. なければ、「'redis://localhost:6379'」の値を使う

デプロイするとき、herokuの設定で「REDIS_URL」を指定しないといけない

開発環境(local)では後者の「'redis://localhost:6379'」を使うことになる


sidekiq.ymlを作成する

congif/sidekiq.ymlのファイルを作成する

:concurrency: 1
:queues:
  - default
  - mailers

concurrencyworkerが同時に捌く数を指定する

defaultmailersqueue(jobを保管するところ)を持っている


Sidekiqの状況を確認できるようにする

routes.rbを開いて、以下を追記する

require 'sidekiq/web'

Rails.application.routes.draw do
  mount Sidekiq::Web => '/sidekiq' if Rails.env.development?

これにより、Sidekiqのqueueの状態(jobの溜まり具合)が見られるようになる


sidekiqを開いてみる

サーバーを立ち上げ直すrails s

bundle exec sidekiq -C config/sidekiq.yml

立ち上がった!

http://localhost:3000/sidekiqにアクセスすると↓こんな画面が表示される


エラーが起きたら

redisとsidekiqのバージョンの組み合わせが悪いと、sidekiqがエラーになる

↓5秒おきにエラーが増えていく・・・

実際、以下の方法で解決できた

Gemfileに追加

gem 'redis', '4.1.3'

両方インストールし、redisサーバーを立ち上げ、sidekiqも起動する

bundle install
brew install redis

redis-server

bundle exec sidekiq -C config/sidekiq.yml

railsサーバーを再起動rails sする

これでエラーが解消されてsidekiqの画面にもアクセスできた

#DAY10