2014-05-21 131 views
1

我開發一個應用程序,它類似於mailchimp,這裏是我的想法是最好的做法來處理所有的羣發電子郵件發送羣發電子郵件發送和beanstalkd

有一個字母模型,有許多列表,以及具有多個聯繫人的列表模型

1-當用戶向某些列表發送簡報(每個列表包含多個訂閱聯繫人)時,新作業將使用Queue :: push排隊,處理這個工作的函數只是使用for循環(不是foreach)遍歷屬於這個字母的每個列表的許多聯繫人(這是這個解決方案中最糟糕的事情)

2 - 對於每個聯繫人,使用Mail ::隊列的郵件發送到該特定聯繫人

3-我使用beanstalkd,和亞馬遜SES SMTP

的問題是我有一個壞的感覺使用a遍歷整個聯繫人,即使整個過程排隊,也會發生如果作業在發送到x聯繫人後的某個點失敗會發生什麼?這是否意味着當它重新啓動時,它會再次將相同的電子郵件發送到相同的聯繫人?

如果有人能提出處理這種情況的最佳做法,我將不勝感激。

+0

如何在多個列表中發生聯繫? – Pinoniq

回答

2

如果作業在發送到x聯繫人後的某個點失敗會發生什麼?

如果您使用Mail::queue() - 它會將每封電子郵件作爲自己的工作排隊。如果一項工作失敗,那麼只有那個單一的工作將被重試。一旦發送每封郵件,它都會從隊列中刪除。

有很多方法可以解決這個問題 - 但我認爲你的方法似乎沒問題。

不要忘了failed jobs section of queues。您可以創建一個失敗表,並告訴你排隊了多少次嘗試,如果作業失敗超過3倍重新發送失敗的電子郵件

php artisan queue:retry 3 

- 它會停止嘗試,並把它的失敗你可以手動管理。或者你可以刪除失敗的工作,如果你想

php artisan queue:forget 3 
+0

@Sherif - 這是否回答你的問題? – Laurence

+0

感謝關於「忘記」和「重試」的寶貴信息,但我最擔心的是for循環部分,想象有人正在發送到10000個聯繫人,循環遍歷所有聯繫人並將每個聯繫人添加到隊列中,如果此功能因任何原因而失敗,不是發送作業,而是通過所有聯繫人循環的作業 – Sherif

+0

好吧 - 如果您擔心 - 在for循環中包含「緩存計數器」。如果函數失敗 - 當你重新加載它時,從「緩存計數器」的開始處開始 - 那麼你可以拿起你離開的地方。 – Laurence