这是 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_jobhandle_asynchronously 功能。

此外,如果您打算处理大量电子邮件,我建议您探索其他选项,例如 Resque or sidekiq or beanstalkd

在处理大量作业时,它们比 delayed_job 更好。 delayed_job 简单且易于设置,但在规模上可能会遇到性能问题。

请参阅 this 了解概览。