1 つのジョブで 5.000 通または 10.000 通の電子メールを送信するプロセスがありますが、他のプロセスがまだ実行されている場合でも、60 秒ごとに開始し続けます。
デーモンコマンドとして:
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"
ここで、複数のリスナーまたは複数のワーカー デーモンを実行すると、約 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 つのキュー デーモン ワーカーまたはキュー リッスンを実行することで問題は解決しますが、可能なはずの 1 つのキューで複数のキュー ワーカーを実行したいと考えています。
Supervisord でプロセスを生成する forge で実行します