【发布时间】:2017-01-13 18:05:27
【问题描述】:
我在 Symfony 中有一个应用程序,需要从应用程序发送电子邮件/通知。 由于电子邮件/通知发送过程需要时间,所以我决定将它们放入队列并定期处理队列。因此,我可以减少涉及电子邮件/通知调度的请求的响应时间。
处理队列的 Cron 作业(一个 php 脚本 - Symfony 路由)每 30 秒运行一次,并检查是否有任何未发送的电子邮件/通知,如果发现它会从队列表中获取所有数据并开始发送它们。发送电子邮件/通知时,队列表行状态标志会更新以显示它已发送。
现在,当队列中有更多电子邮件可能需要 30 多秒才能发送时。另一个 Cron 作业也开始运行并开始从队列中发送电子邮件。因此导致重复发送电子邮件/通知。
我的电子邮件队列表结构如下:
|-------------------------------------|
| id | email | body | status | sentat |
|-------------------------------------|
我解决这个问题的想法如下:
- 在数据库中设置一个 Cron 作业正在运行的标志,如果发现该标志设置,其他 Cron 作业不应继续。
- 将所有记录的状态更新为“已发送”,然后开始发送电子邮件/通知。
所以我的问题是,是否有任何有效的方法来处理队列?是否有任何 Symfony 捆绑包/功能来执行此类特定任务?
【问题讨论】:
-
如果您对工作人员排队感兴趣,请尝试Beanstalkd。还有 upstart、supervisor、runit 以及 Gearman 和 RabbitMQ,尽管这些对于一般邮件队列服务来说要复杂一些。