Devise::Mailer を使用して一度に複数のメールを送信しようとしています。Devise Async を使用して、これらのメールをまとめて送信することでシステム全体の速度を低下させるのではなく、これらのメールをキューに入れたいと考えています (これにより、アプリが約 20 秒遅延する可能性があります)。主な問題は、devise_async gem が sidekiq とまったく通信していないように見えることです (sidekiq ログには何も表示されません)。
掘り下げた後、私が持っているものとdevise_async wikiにあるものとの主な違いは、devise_async.rbファイルにパラメーターが欠落していたことです(残念ながら、これでも問題は解決しません)。
編集:
おそらく問題は、私が sidekiq ワーカーを持っていないことかもしれませんが、devise_async のドキュメントではこれについて触れていません。UserMailer をトリガーする sidekiq ワーカーをトリガーする必要がありますか? UserMailer 自体がワーカーであるという印象を受けました。
devise_async.rb
Devise::Async.setup do |config|
config.enabled = true
config.backend = :sidekiq
config.queue = :default
end
sidekiq.yml
:verbose: true
:concurrency: 25
production:
:concurrency: 20
:queues:
- [mailer, 5]
- [default, 5]
devise.rb
config.mailer_sender = 'test@gmail.com'
config.mailer = 'UserMailer'
user.rb
after_create :send_email_notification
devise :database_authenticatable, :registerable, :timeoutable,
:recoverable, :rememberable, :trackable, :validatable, :async
def send_email_notification
user = User.find(id)
team = Team.find(user.team_id)
team.memberships.each do |membership|
UserMailer.notification_email(user, team, membership).deliver_later
end
end
user_mailer.rb
class UserMailer < Devise::Mailer
default from: "test@gmail.com"
def notification_email(current_user, team, membership)
@user = current_user
if ENV["ENABLE_EMAIL"] == "YES"
if membership.user_id != current_user.id
subject = 'TEST'
@recipient_name = membership.user.userName.titleize
mail(to: membership.user.email, subject: subject)
end
end
end
end