【rails】非同期処理の準備 redisとsidekiqのインストール
メール送付は不安定な処理
前回after_create :send_emailにより、フォロー関係が作られたときにメール送信されるようにした
関連記事:【rails】Mailerの作成
ただメール送信の処理はけっこう不安定なので、メール送信に失敗してフォローも失敗してしまうことがある
create→after_create :send_mail→commit
この流れでインスタンスが作成される(同期処理)send_mailが失敗するとcommitできない
そのため、メールを非同期処理にする
よく失敗する処理、時間のかかる処理は非同期処理にすることが多い
非同期処理とは
[

参考
【JavaScript】同期処理と非同期処理とAjax
わたいろブログ
](/ajax_promise/)
これは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(環境変数に似ている)
- ENVに「
REDIS_URL」のキーがあればその値を使う- なければ、「
'redis://localhost:6379'」の値を使う
デプロイするとき、herokuの設定で「REDIS_URL」を指定しないといけない
開発環境(local)では後者の「'redis://localhost:6379'」を使うことになる
sidekiq.ymlを作成する
congif/sidekiq.ymlのファイルを作成する
:concurrency: 1
:queues:
- default
- mailers
concurrencyはworkerが同時に捌く数を指定する
defaultとmailersのqueue(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