使用MySQL数据库处理PHP Symfony中的队列竞争条件

Dee*_*ary 5 php mysql cron symfony

我在Symfony中有一个应用程序,需要从该应用程序发送电子邮件/通知。由于电子邮件/通知发送过程需要时间,因此我决定将它们放入队列并定期处理队列。因此,我可以减少涉及电子邮件/通知调度的请求的响应时间。

用于处理队列的Cron Job(一个php脚本-Symfony路由)每30秒运行一次,并检查是否发现未发送的Email / Notifications是否从Queue Table获取所有数据并开始发送。发送电子邮件/通知后,“队列表”行状态标志将更新以显示已发送。

现在,当队列中有更多电子邮件时,可能需要30秒钟以上才能发送。另一个Cron作业也开始运行,并开始从队列发送电子邮件。因此导致重复发送电子邮件/通知。

我的电子邮件队列表结构如下:

|-------------------------------------|
| id | email | body | status | sentat |
|-------------------------------------|
Run Code Online (Sandbox Code Playgroud)

解决这个问题的想法如下:

  1. 在数据库中设置一个正在运行Cron作业的标志,如果找到了设置的标志,则其他Cron作业不应继续进行。
  2. 将所有记录的状态更新为“已发送”,然后开始发送电子邮件/通知。

所以我的问题是,是否有任何有效的方法来处理队列?是否有Symfony Bundle / Feature可以完成此类特定任务?

Mak*_*yar 2

所以我的问题是,有没有有效的方法来处理队列?是否有任何 Symfony 捆绑包/功能可以完成此类特定任务?

您可以采取enqueue-bundle加上主义 dbal Transport

它已经处理了竞争条件和其他问题。