2

实际问题

我正在通过 mongoid 使用 Rails 3.0.4 和 MongoDB。

我正在使用@mailgun来传递我的电子邮件。我发送批量(如新闻信)和交易(如激活帐户,忘记密码)电子邮件。现在,我正在使用单个域(转换为 mailgun 端的单个队列)来传递这些邮件。当我有很多批量电子邮件已经排队并且有人注册或请求新密码时,就会出现问题。我希望在批量邮件之前发送事务性电子邮件,但 mailgun 队列以 FIFO 为基础工作。

我想出一种缓解这种情况的方法是使用不同的域(因此可以同时处理不同的队列)来处理批量和事务性邮件。在 rails smtp 设置是应用程序级别设置而不是请求级别设置。所以,我想,我会为不同的 smtp 设置使用不同的环境。

我也有一个邮件队列系统,并且正在使用delayed_job来处理它。我想不出一种方法来区分delayed_job 中的批量邮件和交易邮件。所以,我决定将我的队列系统移动到rescue+redis 或beanstalked+stalker,在那里我可以标记队列并且可以要求工作人员只处理特定的队列。

问题

我想要一些更容易维护、资源消耗最少并且可以很好地扩展的东西。

  • 使用delayed_job,我不需要运行任何其他服务器并对其进行监控。
  • 对于delayed_job,我在机架空间上使用了256MB 的切片,但是redis 和stalker 需要另一台服务器,要么是resque,要么是beantalkd。
  • 我对扩展一无所知,但是自从我的应用程序启动以来的第 2 个月,我已经发送了 30k 多封电子邮件。

如果从 delay_job 移植到 redis 或 stalker 有任何替代方法,请告诉我。

更新:

似乎delayed_job现在也支持命名队列,但尚未记录。打开一张票以添加文档,一旦我知道如何使用它们,就会更新详细信息:)

4

1 回答 1

2

延迟作业接受一个可选的优先级参数(它在链接页面的末尾附近进行了解释)。

例如:

Delayed::Job.enqueue(MailingJob.new(params[:id]), 3)

...3优先级在哪里。

因此,在将群发邮件排入队列时,不要指定优先级,而在将事务性电子邮件排入队列时,请给它们更高的优先级。这样,您的事务性电子邮件将在任何尚未退出的邮件之前进入@mailgun 队列。

除非您的传出 SMTP 服务器的连接速度较慢,否则它每分钟可能会发送数百封电子邮件,所以如果有 200 封群发邮件已经交给 @mailgun 而您,我不会太担心'正在等待交易电子邮件;此后不久它仍会发送。

于 2011-07-21T22:05:44.130 回答