※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。
メール送付は不安定な処理
前回after_create :send_email
により、フォロー関係が作られたときにメール送信されるようにした
ただメール送信の処理はけっこう不安定なので、メール送信に失敗してフォローも失敗してしまうことがある
create
→after_create :send_mail
→commit
この流れでインスタンスが作成される(同期処理)send_mail
が失敗するとcommit
できない
そのため、メールを非同期処理にする
よく失敗する処理、時間のかかる処理は非同期処理にすることが多い
非同期処理とは
これはJavaScriptだけど、今回はRailsで非同期処理をする
Railsでの非同期処理
非同期処理の考え方は以下のとおり
名前 | 意味 |
---|---|
Job (ジョブ) | タスクのようなもの。非同期処理したい事柄のこと。 |
Worker (ワーカー) | Jobを処理していくもの。労働者。 |
Queue (キュー) | Jobが蓄積されているところ。箱のようなもの。 |
- Redisはデータベースの一種
- Railsでは非同期処理する際に使うことが多い
- Jobの内容を保存・保管してくれる
brew install redis
無事にインストール完了(バージョン指定がうまく出来なかったことが心配)
redis-server
こちらもスムーズに完了
サーバーを停止したいときはCtrl+cで終了できる
完全にシャットダウンさせるなら↓を実行する
redis-cli shutdown
Active Job
Railsが用意してくれているActive Jobを使うと、非同期処理が簡単にできる
使うために必要なライブラリを追加していく
sidekiqをインストールするため、Gemfileを開く
gem 'sidekiq', '6.0.5'
開発環境、本番環境どちらでも使うので上の方に追加する
※講義の内容に合わせてバージョン指定
sidekiqがあるとActive Jobが動く
bundle install
config/application.rbを開く
起動時に読み込みたい、アプリケーションの設定を書いておく
config.active_job.queue_adapter = :sidekiq
Active Jobでsidekiqを使うため、指定しておく
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に「
REDIS_URL
」のキーがあればその値を使う - なければ、「
'redis://localhost:6379'
」の値を使う
デプロイするとき、herokuの設定で「REDIS_URL
」を指定しないといけない
開発環境(local)では後者の「'redis://localhost:6379'
」を使うことになる
congif/sidekiq.ymlのファイルを作成する
:concurrency: 1
:queues:
- default
- mailers
concurrency
はworker
が同時に捌く数を指定する
default
とmailers
のqueue
(jobを保管するところ)を持っている
routes.rbを開いて、以下を追記する
require 'sidekiq/web'
Rails.application.routes.draw do
mount Sidekiq::Web => '/sidekiq' if Rails.env.development?
これにより、Sidekiqのqueueの状態(jobの溜まり具合)が見られるようになる
サーバーを立ち上げ直すrails s
bundle exec sidekiq -C config/sidekiq.yml
立ち上がった!
http://localhost:3000/sidekiqにアクセスすると↓こんな画面が表示される
redisとsidekiqのバージョンの組み合わせが悪いと、sidekiqがエラーになる
↓5秒おきにエラーが増えていく・・・
実際、以下の方法で解決できた
gem 'redis', '4.1.3'
bundle install
brew install redis
redis-server
bundle exec sidekiq -C config/sidekiq.yml
これでエラーが解消されてsidekiqの画面にもアクセスできた
#DAY10