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

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

laravel - 在隊列完成所有作業后運行任務

laravel - 在隊列完成所有作業后運行任務

PHP
白豬掌柜的 2023-05-26 16:10:17
我需要為一個可以達到數千個項目的列表運行一個任務。為了避免長時間運行單個作業,我創建了一個作業來對所有項目進行排隊。問題是我需要在該隊列完成之前和之后運行另一個任務。我看到的解決方案是使用延遲:$schedule->job(new \App\Jobs\PauseSystem())     ->hourly('00:01');$schedule->job(new \App\Jobs\EnqueueAllItems()) ->hourly('00:02'); // adds all items as separated job in a queue$schedule->job(new \App\Jobs\ReopenSystem())    ->hourly('55:00');這樣我就有時間00:02確保55:00所有項目都已完成。它看起來不安全,可能會導致工作重疊。在隊列完成所有作業后,有沒有更安全的方法來運行任務?
查看完整描述

1 回答

?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

既然你提到有并行和多個作業,下面是我們解決類似問題的方法。我們有一個報告系統來準備來自多個客戶的報告。有超過1000名客戶。

  • 每個ReportPusher工作負責一個客戶

  • 在這項工作中,我們從不同的數據庫獲取報告并將所有數據推送到存儲桶(redis 列表)。

  • 如果所有工作(有時是 99% 的工作)都完成工作,另一個ReportCollector工作應該完成它的工作。

  • 從單個存儲桶中獲取所有數據、格式化、創建 excel 并發送電子郵件。- 此收集器作業必須在所有ReportPusher作業完成后運行。

我們是怎么做的;

  • ReportPusher同時觸發所有作業

  • 在某個地方設置觸發作業的總數(例如 redis 鍵)$total

  • n分鐘后觸發ReportCollector(可能是15分鐘)

  • 每個ReportPusher作業在完成其過程時都會增加另一個鍵$incremented

  • 15分鐘后ReportCollector工作時,做這些;

    • 如果total等于incremented count讓 ReportCollector 起作用

    • 如果不是,則以 t 延遲(由您決定)+ 增加嘗試觸發相同的作業

    • 在 n 次嘗試(您決定)之后,如果計數仍然不匹配(我上面提到的 %99),則計算報告。

如果一個/兩個客戶出現錯誤,此回退策略是為了防止完全失敗。我們不會僅僅因為一個/兩個客戶而丟棄所有計算數據(客戶的 %99)。您可以放置一些警報/錯誤跟蹤系統以在以后修復損壞的數據。


查看完整回答
反對 回復 2023-05-26
  • 1 回答
  • 0 關注
  • 145 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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