在我的rails应用程序中,我正在使用SendGrid解析API将邮件发布到我的服务器。 SendGrid的Parse API每隔两次提交相同的电子邮件。
当我收到发布的邮件时,我将其放入IncomingMail模型中。所以为了防止这种双重提交问题,我在处理时查看每个IncomingMail,以查看最后一分钟内表中是否有重复。它在开发方面测试得很好,它抓住了所有的双重提交。
现在我把它推到了heroku,在那里我有2个以上的dynos而且它没有用。我的猜测是它与复制有关。既然如此,具有多个服务器的可扩展站点如何处理这样的事情呢?
由于
答案 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