Laravel/PHP queue(隊列)多次執行同一個job問題


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM