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

Posted

技术标签:

【中文标题】构建异步邮件的最佳实践(使用 Sidekiq)【英文标题】:Best practice on structuring asynchronous mailers (using Sidekiq) 【发布时间】:2013-11-06 00:06:45 【问题描述】:

只是想知道在我的 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

然后例如,password_reset 邮件在我的User 模型中发送...

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

所以我想我在这里想知道几件事......

    是否可以在一个工作人员中定义多个“执行”操作?通过这样做,我可以让事情变得简单(一个通知者/邮件工作者),并通过它发送许多不同的电子邮件。或者我应该创建许多工人?每个邮件程序一个(例如 WelcomeEmailWorker、PasswordResetWorker 等),然后将它们全部分配给 Sidekiq 使用相同的“邮件”队列。 我知道它可以按原样工作,但是我应该将这些邮件方法(welcome_email、password_reset 等)中的每一个分解为单独的邮件程序类,还是可以将它们全部归入一个类,如Notifier?李>

非常感谢这里的任何建议。谢谢!

【问题讨论】:

您可以简单地使用:Notifier.delay.password_reset(user)。无需创建单独的工人。见这里:github.com/mperham/sidekiq/wiki/Delayed-Extensions 幸福!棒极了。感谢您的参考。如果您想将其添加为答案,我会接受。 【参考方案1】:

作为discussed here,Sidekiq默认支持延迟邮件,所以不需要创建单独的worker:

Notifier.delay.password_reset(user.id)

【讨论】:

【参考方案2】:

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

Notifier.delay.password_reset(user.id)

【讨论】:

以上是关于构建异步邮件的最佳实践(使用 Sidekiq)的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:从 UI 调用异步代码的最佳实践

使用 fetch 在节点中进行异步 api 调用的最佳实践?

转 Web程序优化的最佳实践(网站内容篇)

将 Django 模型中的保存方法覆盖为使用 celery 异步的最佳实践

在多线程 Rails 环境中使用 Redis 的最佳方式是啥? (彪马/Sidekiq)

异步编程最佳实践