2011-03-09 44 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上啓動一個微型實例並輪詢要發送消息的隊列。從軌道上卸載它。

相關問題