2014-05-21 96 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