构建异步邮件程序的最佳实践(使用Sidekiq)

时间:2013-10-27 02:50:46

标签: ruby-on-rails actionmailer sidekiq

想知道在我的Rails应用程序(使用Sidekiq)中构建异步邮件程序的最佳方法是什么?我有一个ActionMailer类,有多个方法/电子邮件......

notifier.rb

class Notifier < ActionMailer::Base
  default from: "\"Company Name\" <notify@domain.com>"

  default_url_options[:host] = Rails.env.production? ? 'domain.com' : 'localhost:5000'

  def welcome_email(user)
    @user = user
    mail to: @user.email, subject: "Thanks for signing up!"
  end

  ...

  def password_reset(user)
    @user = user
    @edit_password_reset_url = edit_password_reset_url(user.perishable_token)
    mail to: @user.email, subject: "Password Reset"
  end
end

然后,例如,通过执行... {/ p>,在我的User模型中发送password_reset邮件

user.rb

def deliver_password_reset_instructions!
  reset_perishable_token!
  NotifierWorker.perform_async(self)
end

notifier_worker.rb

class NotifierWorker
  include Sidekiq::Worker
  sidekiq_options queue: "mail"

  def perform(user)
    Notifier.password_reset(user).deliver
  end
end

所以我想我在这里想了几件事......

  1. 是否可以在一个工作人员中定义许多“执行”操作?通过这样做,我可以保持简单(一个通知者/邮件工作者),因为我有它,并通过它发送许多不同的电子邮件。或者我应该创造许多工人?每个邮件程序一个(例如WelcomeEmailWorker,PasswordResetWorker等),只需将它们全部分配给Sidekiq使用相同的“邮件”队列。
  2. 我知道它的工作原理,但是我应该将每个邮件方法(welcome_email,password_reset等)分解为单独的邮件程序类,还是可以将它们全部放在像Notifier这样的类中?
  3. 真的很感激这里有任何建议。谢谢!

2 个答案:

答案 0 :(得分:3)

作为discussed here,Sidekiq默认支持延迟邮件,因此无需创建单独的工作人员:

Notifier.delay.password_reset(user.id)

答案 1 :(得分:2)

我不确定,但如果您使用延迟,我认为在邮件程序操作中传递实例并不是一个好主意,所以最好将上面的代码更改为:

Notifier.delay.password_reset(user.id)