轉自:https://phpartisan.cn/news/97.html
在生產環境中,我發現當客戶上傳幾萬數據時,處理時間一般比較長(由於數據結構大,大約幾分鍾);我發現Laravel
隊列不報錯但是執行了3次(我的異常嘗試次數最多為3次),但是系統並未報錯,我開始排查隊列不報錯但是多次執行的原因,發現存在隊列過期的問題,修改retry_after
解決問題。如果你是laravel 5.3
以下環境,修改expire
即可(Redis隊列)。
任務過期
config/queue.php
配置文件里,每一個隊列連接都定義了一個retry_after
選項。這個選項指定了任務最多處理多少秒后就被當做失敗重試了。比如說,如果這個選項設置為90
,那么當這個任務持續執行了90
秒而沒有被刪除,那么它將被釋放回隊列。通常情況下,你應該把 retry_after 設置為最長耗時的任務所對應的時間。
唯一沒有
retry_after
選項的連接是Amazon SQS
。當用Amazon SQS
時,你必須通過Amazon
命令行來配置這個重試閾值。
隊列處理器超時
queue:work
Artisan
命令對外有一個--timeout
選項。這個選項指定了Laravel
隊列處理器最多執行多長時間后就應該被關閉掉。有時候一個隊列的子進程會因為很多原因僵死,比如一個外部的HTTP
請求沒有響應。這個--timeout
選項會移除超出指定事件限制的僵死進程:
php artisan queue:work --timeout=60
retry_after
配置選項和--timeout
命令行選項是不一樣的,但是可以同時工作來保證任務不會丟失並且不會重復執行。
--timeout
應該永遠都要比retry_after
短至少幾秒鍾的時間。這樣就能保證任務進程總能在失敗重試前就被殺死了。如果你的--timeout
選項大於retry_after
配置選項,你的任務可能被執行兩次。