Ruby on rails 什么是「;轨道;阻止向用户发送大量消息?

Ruby on rails 什么是「;轨道;阻止向用户发送大量消息?,ruby-on-rails,throttling,Ruby On Rails,Throttling,当我们的rails 3应用程序向用户发送消息(电子邮件或短信)时,我们需要控制发送速度 假设 the_list = Messages.find(someconditions) the_list.each do |msg| msg.send_me end 返回数百条消息,我们(a)真的不想一次将它们全部存储在内存中,并且(b)不能一次将它们全部释放 如果我们的实际限制是发送,比如说,每分钟200次,那么rails是如何以较小的批量“查找”它们的(b)限制对的呼叫。发送给我以达到我们的目标

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

假设

the_list = Messages.find(someconditions) 
the_list.each do |msg|
   msg.send_me
end
返回数百条消息,我们(a)真的不想一次将它们全部存储在内存中,并且(b)不能一次将它们全部释放

如果我们的实际限制是发送,比如说,每分钟200次,那么rails是如何以较小的批量“查找”它们的(b)限制对的呼叫。发送给我以达到我们的目标发送速率


FWIW我们正在Heroku上运行,出于其他目的,我们现在延迟了\u作业的运行。

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

Messages.find(someconditions, :limit => 100)
如果您想限制,最简单的方法可能是创建多个延迟作业,它们在将来的某个时间运行

如果您想进一步更改您的应用程序,您可以随时将send_添加到messages表中,并在创建邮件时执行以下操作:

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!

然后,在延迟的作业中,您可以选择在处发送消息的位置。这有意义吗?

如果你不能将其从rails进程中卸载,那么就没有办法这样做,否则你会阻止整个应用程序。在ec2上启动一个微实例,并轮询一个包含要发送的消息的队列。从rails卸下它。

谢谢!然后你如何迭代下一个100,下一个100等等?你会一次又一次地找到同样的100个吗?检查我的更新,我认为你最好稍微改变一下你的模型。延迟的工作可以为我们做所有这些。。。我们只需调用msg.delay(xxx)。send__me,当我们告诉它时,它就会将消息排队等待。从您的示例中,我看不到的是如何一次迭代100条消息,而不是每次都重新查找相同的100条消息。问题是,在延迟作业中这样做意味着您的作业可能会运行很长时间。如果您想批量查找,可以使用rails批处理查找程序()。