2011-03-09 28 views
1

当我们的rails 3应用程序向用户发送消息(电子邮件或短信)时,我们需要扼杀我们这样做的速度。什么是“rails方式”来限制向用户发送大量消息?

假设

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

回报数百封邮件,我们(一)不是真的想他们都在内存中一次,和(b)不能一下子解雇他们。

如果我们的实际限制是发送,也就是说,每分钟200,什么是轨道方式小批量“查找”它们(B)节流调用.send_me,以满足我们的目标发送速率

FWIW我们正在Heroku上运行,并有delayed_job现在运行用于其他目的。

回答

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()。这有意义吗?

+0

谢谢!那么你如何迭代下100个,下100个等等?没有重复找到相同的100一遍又一遍? – jpwynn 2011-03-09 23:02:21

+0

检查我的更新,我认为你最好稍微改变你的模型。 – jonnii 2011-03-09 23:04:25

+0

延迟的工作完成了所有这些工作......我们只需调用msg.delay(xxx).send_me,并在我们告诉时将它排队。我没有看到你的例子是如何一次迭代100条消息,而不是每次都重新找到相同的100条消息。 – jpwynn 2011-03-10 00:16:27

1

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

相关问题