1

当我们的 rails 3 应用程序向用户发送消息(电子邮件或短信)时,我们需要限制我们这样做的速率。

认为

the_list = Messages.find(someconditions) 
the_list.each do |msg|
   msg.send_me
end

返回数百条消息,我们 (a) 真的不希望它们一次全部在内存中,并且 (b) 不能一次将它们全部关闭。

如果我们的实际限制是每分钟发送 200 个,那么在较小的批次中“找到”它们的 Rails 方法是什么(b)限制对 .send_me 的调用以满足我们的目标发送速率

FWIW 我们在 Heroku 上运行,并且为其他目的运行了延迟作业。

4

2 回答 2

2

要限制发送的消息数量,您可以使用:

Messages.find(someconditions, :limit => 100)

如果您想节流,最简单的方法可能是run_at在将来某个时间创建多个延迟的作业。

如果您想进一步更改您的应用程序,您可以将 send_at 时间添加到您的消息表中,并在创建消息时执行以下操作:

current_send_at = Message.for_user(current_user).latest.send_at || Time.now
new_message.send_at = current_send_at + 1.minute
new_message.save!

然后在您延迟的工作中,您将选择消息 where send_at < now()。这有意义吗?

于 2011-03-09T22:59:26.033 回答
1

如果您无法从 rails 进程中卸载它,则无法执行此操作,否则您将阻止整个应用程序。在 ec2 上启动一个微实例并轮询一个队列,其中包含要发送的消息。从铁轨上卸下它。

于 2011-03-10T06:56:47.880 回答