Php Laravel多队列:侦听忽略超时/再次启动
所以这似乎是一个奇怪的问题,我们有一个进程在一个作业中发送5000或10000封电子邮件,但它每60秒启动一次,即使另一个进程仍在运行 作为执事命令:Php Laravel多队列:侦听忽略超时/再次启动,php,laravel,queue,supervisord,forge,Php,Laravel,Queue,Supervisord,Forge,所以这似乎是一个奇怪的问题,我们有一个进程在一个作业中发送5000或10000封电子邮件,但它每60秒启动一次,即使另一个进程仍在运行 作为执事命令: queue:work database --sleep=10 --daemon --quiet --tries=3 --env=production --queue="default" queue:listen database --timeout=600 --sleep=10 --quiet --tries=3 --env=productio
queue:work database --sleep=10 --daemon --quiet --tries=3 --env=production --queue="default"
queue:listen database --timeout=600 --sleep=10 --quiet --tries=3 --env=production --queue="emails"
作为listen命令:
queue:work database --sleep=10 --daemon --quiet --tries=3 --env=production --queue="default"
queue:listen database --timeout=600 --sleep=10 --quiet --tries=3 --env=production --queue="emails"
这里发生的事情是,如果我们在大约60秒后运行多个侦听器或多个worker deamons,一个新进程将重新启动,感觉像是php超时,但另一个进程将继续,因此它似乎无缘无故地启动一个新进程。在代码中,它将循环,每次从DB收到100封电子邮件并写入日志文件
\Log::info("Getting {$emails->count()} new e-mails, round: {$this->round}
日志文件:
[2015-11-09 13:02:27] production.INFO: Getting 100 new e-mails, round: 1
[2015-11-09 13:02:32] production.INFO: Getting 100 new e-mails, round: 2
[2015-11-09 13:02:38] production.INFO: Getting 100 new e-mails, round: 3
[2015-11-09 13:02:43] production.INFO: Getting 100 new e-mails, round: 4
[2015-11-09 13:02:49] production.INFO: Getting 100 new e-mails, round: 5
[2015-11-09 13:02:55] production.INFO: Getting 100 new e-mails, round: 6
[2015-11-09 13:03:00] production.INFO: Getting 100 new e-mails, round: 7
[2015-11-09 13:03:06] production.INFO: Getting 100 new e-mails, round: 8
[2015-11-09 13:03:11] production.INFO: Getting 100 new e-mails, round: 9
[2015-11-09 13:03:17] production.INFO: Getting 100 new e-mails, round: 10
[2015-11-09 13:03:22] production.INFO: Getting 100 new e-mails, round: 11
[2015-11-09 13:03:28] production.INFO: Getting 100 new e-mails, round: 12
[2015-11-09 13:03:32] production.INFO: Getting 100 new e-mails, round: 1
[2015-11-09 13:03:35] production.INFO: Getting 100 new e-mails, round: 13
[2015-11-09 13:03:42] production.INFO: Getting 100 new e-mails, round: 2
[2015-11-09 13:03:45] production.INFO: Getting 100 new e-mails, round: 14
[2015-11-09 13:03:52] production.INFO: Getting 100 new e-mails, round: 3
在这里,您可以看到旧流程继续,新流程开始,因此它会发送两封电子邮件。启动新进程时,jobs表将尝试次数更新为1,并同时更新reserved_at
有人能帮我吗?这一定是很愚蠢的事情,但我们几乎尝试了所有的方法,而且它一直运行了很多次。运行1个queue deamon worker或queue listen可以解决问题,但我们希望在一个队列上运行多个队列worker,这应该是可能的
我们在forge上运行,生成了带有supervisord的进程,因为Laravel中的TTR(运行时间)为60秒,可以在queue.php配置中配置,仍然在寻找一种解决方案,以每个作业为基础而不是整体设置TTR。我将仅为此作业创建一个单独的队列,并仅使用一个侦听器/工作线程来处理它,这就像在队列配置中向连接数组添加一个新队列一样简单。如果您对两个队列使用相同的驱动程序,并且应该为您解决这个问题,那么这实际上只是一个逻辑分离。然后,您可以向数组中添加另一个通用队列,并针对其他类型的作业运行多个侦听器。