【问题标题】:Heroku - Issue due to multiple DynosHeroku - 由于多个 Dynos 导致的问题
【发布时间】:2011-07-10 20:51:19
【问题描述】:

在我的 rails 应用程序中,我使用了 SendGrid 解析 API,它将邮件发送到我的服务器。 SendGrid 的 Parse API 时不时地提交两次相同的电子邮件。

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

现在我把那个 live 推送到 heroku,我有 2+ dynos 并且它没有工作。我的猜测是它与复制有关。既然如此,具有多个服务器的可扩展站点如何处理这样的事情?

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    在每次用户操作时等待电子邮件提供商之类的外部服务是危险的,因为任何网络问题都会导致您的网站瘫痪,因为有几个用户必须“等待”他们的 HTTP 请求得到响应,而 Heroku 被这些第三方阻止聚会电话。

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

    【讨论】:

    • 感谢 Stef,但我已经在 heroku 上使用了 1 个工人。想法?
    • 我想知道是不是数据库的复制速度不够快?
    【解决方案2】:

    这听起来可能是交易问题。如果您有多个工作人员同时运行,他们的操作可能是“交错的”。例如,这一系列事件将导致发送 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
    

    【讨论】:

      猜你喜欢
      • 2014-07-13
      • 2017-09-01
      • 1970-01-01
      • 2021-02-05
      • 2014-03-30
      • 1970-01-01
      • 2023-03-16
      • 2013-04-04
      • 2018-03-14
      相关资源
      最近更新 更多