所以这似乎是一个奇怪的问题,我们有一个进程可以在一个作业中发送5.000或10.000封电子邮件,但即使其他进程仍在运行,它也会每60秒启动一次。
作为deamon命令:
queue:work database --sleep=10 --daemon --quiet --tries=3 --env=production --queue="default"
作为listen命令:
queue:listen database --timeout=600 --sleep=10 --quiet --tries=3 --env=production --queue="emails"
如果我们在aprox 60秒后运行多个监听器或多个工作者守护程序,新进程将重新开始,这里发生的事情,感觉就像是一个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个队列deamon worker或queue listen解决了这个问题,但我们希望在一个队列上运行多个队列worker,这应该是可能的。
我们运行使用supervisord生成进程的forge