Ruby on rails 结合主动工作和行动邮件的最佳方法?
使用Rails Action Mailer时,您可以选择使用Ruby on rails 结合主动工作和行动邮件的最佳方法?,ruby-on-rails,actionmailer,rails-activejob,Ruby On Rails,Actionmailer,Rails Activejob,使用Rails Action Mailer时,您可以选择使用deliver\u now立即发送电子邮件,或deliver\u later使用Active Job异步发送。如果活动作业未指定适配器,则它将使用进程内线程池,如果服务器停止,该线程池将不会持久化。或者,我可以创建一个作业来管理我的电子邮件,然后我可以使用perform\u now或perform\u later调用它,据我所知,这与deliver\u now和deliver\u later大致相同 我的问题是,如果我指定一个适配器,比
deliver\u now
立即发送电子邮件,或deliver\u later
使用Active Job异步发送。如果活动作业未指定适配器,则它将使用进程内线程池,如果服务器停止,该线程池将不会持久化。或者,我可以创建一个作业来管理我的电子邮件,然后我可以使用perform\u now
或perform\u later
调用它,据我所知,这与deliver\u now
和deliver\u later
大致相同
我的问题是,如果我指定一个适配器,比如说Sidekiq,然后有一个数据库来存储我的作业,为什么我要创建一个作业来处理我的电子邮件?是否有任何额外的好处,或这是一个不必要的步骤?另一方面,如果我真的想为流程创建一个作业,那么我的电子邮件方法是否需要现在就交付,或者干脆什么都不发送?我猜想,如果电子邮件上写着“以后发送”,它会不会将电子邮件击退到队列的末尾,并迫使它再次等待,直到它被发送?
举例来说,如果我没有处理电子邮件的工作,我只需要:
class UserMailer < ActionMailer::Base
def send_email(user)
mail(to: user.email, subject: "My Subject")
end
end
或
最后,我认为这没有意义,但如果我使用:
def perform(user)
UserMailer.send_email(user).deliver_later
end
我使用Sidekiq进行异步作业。使用Sidekiq可以创建称为workers的特殊块。你可以现在打电话给工人,或者晚一点打电话,或者晚一点打电话给工人,在x分钟或小时内打电话。如果稍后交付,则作业(工作人员)将被放置在队列中,并在处理队列中前面的每个项目时进行处理。在一个工人身上,我“现在”投递邮件。我不知道Sidekiq以外的活跃工作是如何工作的。我以后只给员工发邮件,不发邮件。这个帖子可能会消除你的疑虑:我建议你只在现在发送电子邮件,如果以后需要发送电子邮件,就把它放在工作中。你在那里问了几个不同的问题和各种后续问题。我认为如果你坚持一个明确的问题,你就更有可能得到更好的答案。
def perform(user)
UserMailer.send_email(user)
end
def perform(user)
UserMailer.send_email(user).deliver_later
end