限制向用户发送大量消息的“轨道方式”是什么?

时间:2011-03-09 22:50:50

标签: ruby-on-rails throttling

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

假设

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

返回数百条消息,我们(a)并不真的希望它们一次全部存储在内存中,并且(b)不能同时将它们全部发送出去。

如果我们的实际限制是发送,比方说,每分钟200,那么以较小批量“找到”它们的轨道方式是什么(b)限制对.send_me的调用以满足我们的目标发送速率

FWIW我们正在Heroku上运行,并且已经将delayed_job用于其他目的。

2 个答案:

答案 0 :(得分: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!

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

答案 1 :(得分:1)

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