铁轨:缠扰者,救援或其他

时间:2011-07-21 21:44:51

标签: ruby-on-rails background scalability maintainability

实际问题

我通过mongoid使用Rails 3.0.4和MongoDB。

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

我认为减轻这种情况的方法可以是对批量邮件和事务邮件使用不同的域(因此可以同时处理不同的队列)。在rails中,smtp设置是应用程序级别设置,而不是请求级别设置。所以,我想,我将使用不同的环境进行不同的smtp设置。

我还有一个邮件队列系统,我正在使用delayed_job来处理它。我无法找到区分delayed_job中批量邮件和事务邮件的方法。所以,我决定将我的队列系统移到rescue + redis或beanstalked + stalker,在那里我可以标记队列,并且可以要求工人只处理特定的队列。

问题

我想要的东西更容易维护,资源最少,可以很好地扩展。

  • 使用delayed_job我不需要运行任何其他服务器并对其进行监控。
  • 对于delayed_job,我在机架空间使用256MB切片,但redis和stalker需要另一台服务器,resque或beanstalkd。
  • 我不知道扩展,但是自我推出应用程序以来的第二个月,我已经发送了30k +电子邮件。

如果有任何替代方法从delayed_job移植到redis或跟踪者,请告知我们。

更新:

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

1 个答案:

答案 0 :(得分:2)

延迟作业接受an optional priority parameter(在链接页面末尾附近解释)。

例如:

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

...其中3是优先事项。

因此,在群发邮件时,不指定优先级,并且在您的交易电子邮件中添加更高级别的邮件时。通过这种方式,您的交易电子邮件将在尚未出现的任何内容之前输入@mailgun队列。

除非您的外发SMTP服务器有某种慢速连接,否则它可能每分钟发送几百封电子邮件,所以如果有200封已经发送给@的群发邮件,我不会太担心mailgun,你在等待交易电子邮件;它很快就会发送。