【发布时间】:2011-10-18 14:39:49
【问题描述】:
我的问题是如何使用延迟作业 gem 每 n 秒运行 x 数量的作业?
例子
我想发送大量的时事通讯。但是,当我发送 #50(“示例”)邮件时,GMail 不会发送电子邮件(垃圾邮件),但其内容有点不同。
因此,如果我每 3 分钟按 20 个用户组发送时事通讯,GMail 可能会正确发送电子邮件。
提前致谢
【问题讨论】:
我的问题是如何使用延迟作业 gem 每 n 秒运行 x 数量的作业?
例子
我想发送大量的时事通讯。但是,当我发送 #50(“示例”)邮件时,GMail 不会发送电子邮件(垃圾邮件),但其内容有点不同。
因此,如果我每 3 分钟按 20 个用户组发送时事通讯,GMail 可能会正确发送电子邮件。
提前致谢
【问题讨论】:
delayed_job 有一个选项:run_at(https://github.com/collectiveidea/delayed_job),您可以使用它来设置作业应该在什么时间运行。它不能保证作业是否会在那个时候运行,但它肯定不会在那之前运行。
因此,20 封邮件/3 分钟 = 1 封电子邮件/9 秒。
你可以这样做:
now = Time.now
count = 0
# then for each newsletter schedule it at intervals of 9 secs
users.each do |u|
WhateverMailer.delay(:run_at => now + count*9).news_letter(u)
count += 1
end
【讨论】:
您可以使用基于云的调度和后台处理服务 SimpleWorker 来执行此类操作。它提供了类似于 DelayedJob 的功能,但无需管理服务器和队列。 (我在 Iron.io 工作,SimpleWorker 的制造商)。
您可以安排一个作业每 X 秒运行一次或安排多个作业在特定时间进入队列(不同的优先级具有不同的目标运行窗口)。但是,您可能希望拥有一个或多个定期运行的主作业,然后将一个或多个从属作业排队以发送实际的电子邮件,而不是预先安排大量作业(每个作业都检查数据库以获取下一组发送)。
当面临通过 API 获取数据的阈值时,您可以使用相同的方法。如果您愿意,很乐意进一步讨论。
肯
【讨论】: