【问题标题】:Rails: stalker, rescue or something elseRails:潜行者,救援或其他
【发布时间】:2011-10-10 14:59:44
【问题描述】:

实际问题

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

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

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

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

问题

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

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

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

更新:

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

【问题讨论】:

  • 单独的@mailgun 实例?一种用于批量,一种用于交易?
  • 您是在建议还是在询问?如果在 sendgrid 中询问类似的子用户,该计划以 80 美元的计划开始,但在 mailgun 上则以 19 美元的计划获得。

标签: ruby-on-rails background scalability maintainability


【解决方案1】:

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

例如:

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

...3 是优先级。

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

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

【讨论】:

  • 我知道优先级参数,并尝试使用它,但 mailgun 接受电子邮件的速度远高于发送速度。所以它并没有真正帮助。根据github上delayed_job的主页,“数字越小优先级越高。”
  • 出于好奇,有多少封电子邮件,您的实际延迟是多少?您是否真的在观看@mailgun 的 SMTP 队列并确保存在延迟(而不是在接收端)?如果是这样,而且你的排队时间仍然很长,我想我的回答变得无关紧要了。
  • 我每周向我的所有用户发送时事通讯,现在有近 3k 用户,我的邮件以 40 分钟左右的速度送达,上次我运行任务时,我将所有电子邮件推送到 mailgun不到5分钟。新闻信件是我邮件流量中最大的峰值。还有其他的,但所有这些都比新闻信要小。
  • 您能否以 100 封电子邮件块的形式提交群发邮件,在处理事务性电子邮件之间留出一小段时间,但让群发邮件快速发出?也就是说,一次只提交延迟作业的东西 100 个元素?
  • 这听起来是个好主意,有什么办法可以告诉我如何做到这一点吗?
猜你喜欢
  • 1970-01-01
  • 2018-08-12
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多