这是 Delayed Job、Rails 和 Mandrill 的预期行为吗?
Is this expected behaviour for Delayed Job, Rails and Mandrill?
与 相关,它解释了控制器中逻辑的起源,我对延迟作业的后台作业有疑问,然后将其推送到 github 并重新部署。
模型和作用域有效,控制器中的逻辑有效,电子邮件 text.erb 文件中的条件有效,用户要么是读者或订阅者,可以在 "My Account" 页面上设置他们的电子邮件首选项:[文章和更新、仅文章、无电子邮件等]。 Delayed Job 是在后台设置和处理的,让前端一如既往的漂亮和快速,Mandrill SMTP 正确接收它并快速发送电子邮件。
article_controller 中的主要逻辑块这样做是为了向正确的用户发送正确的电子邮件:
if @article.update(article_params) && @article.status == 'published' && @article.created_at.today?
User.wantsarticles.editor.each do |user|
ArticleMailer.delay.send_article_full(@article, user)
end
User.wantsarticles.subscribers.each do |user|
ArticleMailer.delay.send_article_full(@article, user)
end
User.wantsarticles.readers.each do |user|
ArticleMailer.delay.send_article_teaser(@article, user)
end
format.html { redirect_to :action => 'admin', notice: 'Article was successfully updated.' }
format.json { render :show, status: :ok, location: @article }
else
format.html { redirect_to :action => 'admin', notice: 'Article was successfully updated.' }
format.json { render :show, status: :ok, location: @article }
end
查看 Rails 和延迟作业日志,但是,当它循环遍历逻辑并决定需要发送三封电子邮件时,测试集只有几个用户(5-10)发出后,Rails 正在对 DJ table 执行三个 INSERT INTO,然后 DJ 对每个执行此操作:
Job NewsitemMailer.send_article_full (id=21) RUNNING
Job NewsitemMailer.send_article_full (id=21) COMPLETED after 0.8950
然后当它完成时,它返回报告:
3 jobs processed at 0.9039 j/s, 0 failed
并且在 Mandrill 日志中,每封发送的电子邮件都有自己的 API "success/fail" 条目。
所以:这是延迟作业的 correct/expected 行为吗?是否应该为每封电子邮件创建一份工作?或者以不同的方式处理它们?当我们开始做 X 千而不是 ten/three 时,这种做事方式会破坏服务器吗?
这看起来像 delayed_job
的默认行为。您已经 ArticleMailer.delay
调用了 3 次,它会将它们全部排队,因此您会看到 3 jobs processed
.
我认为,您还应该看看 delayed_job
的 handle_asynchronously
功能。
此外,如果您打算处理大量电子邮件,我建议您探索其他选项,例如 Resque or sidekiq or beanstalkd
在处理大量作业时,它们比 delayed_job
更好。 delayed_job
简单且易于设置,但在规模上可能会遇到性能问题。
请参阅 this 了解概览。
与
模型和作用域有效,控制器中的逻辑有效,电子邮件 text.erb 文件中的条件有效,用户要么是读者或订阅者,可以在 "My Account" 页面上设置他们的电子邮件首选项:[文章和更新、仅文章、无电子邮件等]。 Delayed Job 是在后台设置和处理的,让前端一如既往的漂亮和快速,Mandrill SMTP 正确接收它并快速发送电子邮件。
article_controller 中的主要逻辑块这样做是为了向正确的用户发送正确的电子邮件:
if @article.update(article_params) && @article.status == 'published' && @article.created_at.today?
User.wantsarticles.editor.each do |user|
ArticleMailer.delay.send_article_full(@article, user)
end
User.wantsarticles.subscribers.each do |user|
ArticleMailer.delay.send_article_full(@article, user)
end
User.wantsarticles.readers.each do |user|
ArticleMailer.delay.send_article_teaser(@article, user)
end
format.html { redirect_to :action => 'admin', notice: 'Article was successfully updated.' }
format.json { render :show, status: :ok, location: @article }
else
format.html { redirect_to :action => 'admin', notice: 'Article was successfully updated.' }
format.json { render :show, status: :ok, location: @article }
end
查看 Rails 和延迟作业日志,但是,当它循环遍历逻辑并决定需要发送三封电子邮件时,测试集只有几个用户(5-10)发出后,Rails 正在对 DJ table 执行三个 INSERT INTO,然后 DJ 对每个执行此操作:
Job NewsitemMailer.send_article_full (id=21) RUNNING
Job NewsitemMailer.send_article_full (id=21) COMPLETED after 0.8950
然后当它完成时,它返回报告:
3 jobs processed at 0.9039 j/s, 0 failed
并且在 Mandrill 日志中,每封发送的电子邮件都有自己的 API "success/fail" 条目。
所以:这是延迟作业的 correct/expected 行为吗?是否应该为每封电子邮件创建一份工作?或者以不同的方式处理它们?当我们开始做 X 千而不是 ten/three 时,这种做事方式会破坏服务器吗?
这看起来像 delayed_job
的默认行为。您已经 ArticleMailer.delay
调用了 3 次,它会将它们全部排队,因此您会看到 3 jobs processed
.
我认为,您还应该看看 delayed_job
的 handle_asynchronously
功能。
此外,如果您打算处理大量电子邮件,我建议您探索其他选项,例如 Resque or sidekiq or beanstalkd
在处理大量作业时,它们比 delayed_job
更好。 delayed_job
简单且易于设置,但在规模上可能会遇到性能问题。
请参阅 this 了解概览。