构建异步邮件的最佳实践(使用 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)的主要内容,如果未能解决你的问题,请参考以下文章
使用 fetch 在节点中进行异步 api 调用的最佳实践?
将 Django 模型中的保存方法覆盖为使用 celery 异步的最佳实践