轉自: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配置選項,你的任務可能被執行兩次。
