Heroku - 由于多个Dynos问题

时间:2011-03-08 05:37:05

标签: ruby-on-rails ruby-on-rails-3 heroku scalability

在我的rails应用程序中,我正在使用SendGrid解析API将邮件发布到我的服务器。 SendGrid的Parse API每隔两次提交相同的电子邮件。

当我收到发布的邮件时,我将其放入IncomingMail模型中。所以为了防止这种双重提交问题,我在处理时查看每个IncomingMail,以查看最后一分钟内表中是否有重复。它在开发方面测试得很好,它抓住了所有的双重提交。

现在我把它推到了heroku,在那里我有2个以上的dynos而且它没有用。我的猜测是它与复制有关。既然如此,具有多个服务器的可扩展站点如何处理这样的事情呢?

由于

2 个答案:

答案 0 :(得分:2)

您应该查看使用后台作业队列。 Heroku有“Workers”(延迟工作)。您可以将其推送到队列中,而不是立即发送电子邮件。然后需要将一个或多个Heroku'工作人员'添加到您的帐户中,每个人都将按顺序提取工作。这意味着在发送电子邮件之前可能会有短暂的延迟(取决于负载),但这种延迟不会呈现给用户,如果有很多电子邮件要发送给您,只需添加更多工作人员。

在每个用户操作上等待电子邮件提供商等外部服务是危险的,因为任何网络问题都会占用您的网站,因为有几个用户必须“等待”他们的HTTP请求被响应而Heroku被这些第三个阻止派对电话。

在这种情况下,工人每个工作都会失败,但会重试并最终成功。

答案 1 :(得分:0)

这听起来像是一个交易问题。如果您有多个工作人员同时运行,他们的操作可能会“交错”。例如,这一系列事件将导致发送2封邮件。

工人A:检查现有记录但未找到 工人B:检查现有记录但找不到记录 工人A:发布到Sendgrid 工人B:发送到Sendgrid

您可以在事务中包装所有内容以防止这种情况发生。这样的事情应该做到。

class IncomingMail < ActiveRecord::Base

  def check_and_send(email_address)
    transaction do
      # your existing code for preventing duplicates and sending
    end
  end

end