我正在尝试使用 Devise::Mailer 一次发送多封电子邮件。使用 Devise Async,我想将这些电子邮件排队,而不是通过完全发送它们来减慢整个系统的速度(这可能会使应用程序延迟大约 20 秒)。主要问题似乎是 devise_async gem 似乎根本没有与 sidekiq 通信(我在 sidekiq 日志中看不到任何内容)。
经过大量挖掘,与我所拥有的和 devise_async wiki 中的主要区别在于 devise_async.rb 文件缺少参数(不幸的是,这仍然不能解决问题)。
编辑:
问题可能是我没有 sidekiq 工作人员——尽管 devise_async 文档没有谈到这一点。我是否需要触发将触发 UserMailer 的 sidekiq 工作人员?我的印象是 UserMailer 本身就是一个工人。
设计异步.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]
设计.rb
config.mailer_sender = 'test@gmail.com'
config.mailer = 'UserMailer'
用户.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