2

所以这似乎是一个奇怪的问题,我们有一个进程在 1 个作业中发送 5.000 或 10.000 封电子邮件,但即使其他进程仍在运行,它也会每 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=production --queue="emails"

如果我们在大约 60 秒后运行多个侦听器或多个工作守护程序,则会发生这里的事情,一个新进程将重新开始,感觉就像一个 php 超时,但另一个进程将继续,所以它似乎开始一个新进程没理由。在代码中它将循环,每次从数据库中获取 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

在这里,您可以看到旧流程继续进行并开始新流程,因此它会发送双份电子邮件。当开始一个新进程时,作业表将尝试更新为 1,并且 reserved_at 也会更新。

任何人都可以在这里帮助我,这一定很愚蠢,但我们几乎尝试了所有方法,并且它一直运行多次。运行 1 个队列守护进程或队列侦听可以解决问题,但我们希望在一个队列上运行多个队列工作者,这应该是可能的。

我们在 forge 上运行,它使用 supervisord 生成进程

4

0 回答 0