亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Laravel 自定義隊列不尊重 retry_after

Laravel 自定義隊列不尊重 retry_after

PHP
桃花長相依 2022-07-29 10:31:52
我在使用自定義 laravel 隊列連接/隊列時遇到了一些問題。這個特定的連接/隊列用于可能需要 5 分鐘到 10 小時的作業(大型數據聚合和數據重建)我有一個主管 conf 定義為[program:laravel-worker-extended]process_name=%(program_name)s_%(process_num)02dcommand=php /var/www/artisan queue:work --queue=refreshQueue,rebuildQueue --sleep=3 --timeout=86400 --tries=2 --delay=360autostart=trueautorestart=trueuser=rootnumprocs=4redirect_stderr=truestdout_logfile=/var/www/storage/logs/queue-worker.log我有一個隊列連接定義為:        'refreshQueue' => [            'driver' => 'database',            'table' => 'jobs',            'queue' => 'refreshQueue',            'retry_after' => 420,   // Retry after 7 minutes        ],我通過以下命令使用命令將作業添加到隊列中:AggregateData::dispatch()->onConnection('refreshQueue')->onQueue('refreshQueue');構造 DatabaseQueue 時,retryAfter 定義為 420。但是這是我的工作日志:[2020-01-22 18:25:37] local.INFO: BEGINNING AGGREGATION  [2020-01-22 18:25:37] local.INFO: Aggregating data  [2020-01-22 18:27:08] local.INFO: BEGINNING AGGREGATION  [2020-01-22 18:27:08] local.ALERT: AGGREGATION FAILED: Aggregation in progress 為什么當我明確告訴它在 420 之后重試時,它會在 90 秒后繼續重試?我已經重建了我的容器,重新啟動了隊列,并完成了我可以調試的所有其他事情......然后等待一段時間,我得到了最終的日志輸出:[2020-01-22 18:25:37] local.INFO: BEGINNING AGGREGATION  [2020-01-22 18:25:37] local.INFO: Aggregating data  [2020-01-22 18:27:08] local.INFO: BEGINNING AGGREGATION  [2020-01-22 18:27:08] local.ALERT: AGGREGATION FAILED: Aggregation in progress  [2020-01-22 18:33:04] local.INFO: [COMPLETE] Aggregating data  [2020-01-22 18:33:04] local.INFO: Queue job finishedIlluminate\Queue\CallQueuedHandler@call我不太明白為什么隊列在 90 秒后繼續重試作業。我在這里做錯了嗎?在此處編輯一些其他上下文:此方法in_progress在開始時設置一個標志,因此它不能在同一時間運行兩次。日志可以解釋為:BEGINNING AGGREGATIONhandle():工作方法的第一行AGGREGATION FAILED: Aggregation in progress:failed()作業的方法通過異常處理失敗。這一行表明它再次嘗試了該作業,并且遇到了設置為1已經表示另一個作業正在處理的標志。當作業完成或遇到不同的異常(不是“進行中”)時,此標志將重置為 0。Queue job finishedIlluminate\Queue\CallQueuedHandler@call我在服務提供者中添加了進一步調試以偵聽隊列完成事件。
查看完整描述

2 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

這可能與您正在使用的時間超時有關。從文檔

--timeout 值應始終比您的 retry_after 配置值短幾秒鐘。這將確保處理給定作業的工作人員總是在重試作業之前被殺死。如果您的 --timeout 選項比您的 retry_after 配置值長,您的作業可能會被處理兩次。


查看完整回答
反對 回復 2022-07-29
?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

我已經弄清楚了這里的問題。在queue.php我定義一個連接 refreshQueue。但是,在我的主管 conf 中,我使用的是:

command=php /var/www/artisan queue:work --queue=refreshQueue,rebuildQueue --sleep=3 --timeout=86400 --tries=2 --delay=360

作為命令 ( --queue),命令應該是:

command=php /var/www/artisan queue:work refreshQueue --sleep=3 --timeout=86400 --tries=2 --delay=360

注意缺少--queue連接有定義,而retry_after不是隊列本身。

這是關于連接與隊列差異的寶貴經驗。


查看完整回答
反對 回復 2022-07-29
  • 2 回答
  • 0 關注
  • 327 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號