Heroku / rails:发送大量邮件时出错302

时间:2012-08-28 12:18:40

标签: ruby-on-rails email heroku timeout

我向每位用户发送一封电子邮件的所有用户发送邮件。

该功能有效,但我在网络应用上收到一条丑陋的错误消息。在我得到的日志上

2012-08-28T12:08:03+00:00 heroku[router]: Error H12 (Request timeout) -> POST afternoon-spring-6294.herokuapp.com/welcome/wall dyno=web.1 queue= wait= service=30000ms status=503 bytes=0
[...]
Sent mail to xxxx@xxxxx.xxxx (1708ms)
2012-08-28T12:08:31+00:00 app[web.1]: Redirected to http://afternoon-spring-6294.herokuapp.com/
2012-08-28T12:08:31+00:00 app[web.1]: Completed 302 Found in 58114ms (ActiveRecord: 8.9ms)

是否有解决方法(仅由33封电子邮件触发)?

1 个答案:

答案 0 :(得分:1)

Heroku reaps all process that run longer than 30s,这意味着几乎所有通过mailgun或sendgrid之类的批量电子邮件都会因H12错误而被杀死。

有几种基本的处理方式,但都涉及使事情变得更加异步。 Heroku worker processes可以无限期地运行 - 或者至少FAR超过30秒。

传统的选择是使用queue - delayed_job很简单,只需要一个数据库来支持它。 Resque也很酷,但需要将Redis添加到混合物中。还有许多更复杂的选项,但delayed_job很简单。 Railscasts可能是你的朋友,想知道怎么做。

另一种选择是使用工作进程直接处理电子邮件任务。例如,您可以使用工作人员使用rake任务每隔X分钟批量发送电子邮件。这是一种没有所有开销的队列。我们假设您需要发送一批邀请,您可以将具有未发送状态的邀请写入表格,然后让第一个请求弹出一个rake任务并发送,重复直到完成。你基本上是重新实现一个简单的队列,但可能会觉得更舒服。

就个人而言,我需要放入delayed_job,直到我需要更强大的功能。