我有一个应用程序在Symfony需要发送电子邮件/通知从应用程序。由于电子邮件/通知发送过程需要时间,所以我决定将它们放入队列中,并定期处理队列。因此,我可以减少涉及电子邮件/通知分派的请求的响应时间。
处理队列的Cron作业(一个php脚本-Symfony路由)每30秒运行一次,检查是否有未发送的电子邮件/通知,如果发现,它将从队列表中获取所有数据并开始发送它们。当发送电子邮件/通知时,队列表行状态标志将被更新,以显示它已发送。
现在,当有更多的电子邮件在队列中,可能需要超过30秒发送。另一个Cron作业也开始运行,并开始从队列发送电子邮件。从而导致发送重复的电子邮件/通知。
我的电子邮件队列表结构如下:
|-------------------------------------|
| id | email | body | status | sentat |
|-------------------------------------|
我解决这个问题的想法如下:
所以我的问题是,有没有什么高效的方法来处理队列?有什么Symfony捆绑包/特性来完成这样的特定任务吗?
所以我的问题是,有没有什么高效的方法来处理队列?有什么Symfony捆绑包/特性来完成这样的特定任务吗?
您可以采用排队束加dbal运输。
它已经照顾到种族条件和其他东西。
关于您的建议:
>
如果cronjob进程死亡(无论出于什么原因)并且无法清理标志,该怎么办?我认为旗子不是个好主意。如果您希望遵循这种方法,则不应使用布尔值,而应使用进程ID或时间戳,这样您就可以检查进程是否仍然存在,或者它是否在很久以前就开始了,而没有进行清理。
同样的问题:如果进程死了怎么办?您不希望在邮件发送之前将其标记为已发送。
我想我可能会使用两个字段:一个用于将一条记录标记为“发送中进行”(从而告诉其他进程跳过此记录),另一个用于将其标记为“发送成功完成”。我会给这两个都写一个时间戳,这样我就可以(自动或手动)找到那些“正在进行中的发送”在过去大于X秒的记录,这将是一个已死亡进程的指示器。