下面由Laravel教程欄目給大家介紹Laravel 8 隊(duì)列系統(tǒng)的新功能和變化,希望對(duì)需要的朋友有所幫助!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、虛擬主機(jī)、營銷軟件、網(wǎng)站建設(shè)、河池網(wǎng)站維護(hù)、網(wǎng)站推廣。Laravel 8 附帶了很酷的新特性,并對(duì)隊(duì)列系統(tǒng)的一些更改。在本文中,我們將研究這些特性和更改。
變化
Backoff (回退)
已將 retryAfter()
方法和 retryAfter
排隊(duì)作業(yè),郵件,通知和偵聽器的屬性重命名為backoff
。
php artisan queue:work
命令的 --delay
選項(xiàng)也已重命名為 --backoff
。
您還應(yīng)該知道,現(xiàn)在可以將數(shù)組傳遞給 backoff
屬性,以指示 worker 實(shí)現(xiàn)指數(shù)回退 (exponential backoff):
public $backoff = [30, 60];
或者從 backoff()
方法返回一個(gè)數(shù)組:
public function backoff() { return [30, 60]; }
在這里使用指數(shù)回退,我們指示 worker 在第一次失敗后延遲 30 秒重試作業(yè),然后在每次失敗后延遲 60 秒。
您還可以在 queue:work
命令上使用指數(shù)回退:
php artisan queue:Work --backoff=30,60
作業(yè)過期
排隊(duì)作業(yè),通知和偵聽器的 timeoutAt
屬性已重命名為 retryUntil
。
使用 $retryUntil
指示 worker 繼續(xù)重試作業(yè),直到將來的某個(gè)時(shí)間為止。
您可以將 retryUntil
作為作業(yè)類的公共屬性或 retryUntil
方法添加:
public function retryUntil() { return now()->addDay(); }
新特性
隊(duì)列閉包
您現(xiàn)在可以在調(diào)度隊(duì)列閉包時(shí)鏈?zhǔn)秸{(diào)用 catch()
方法:
dispatch(function () { // Job logic... })->catch(function (Throwable $e) { // Handle Failure... });
如果作業(yè)失敗,將調(diào)用提供給 catch()
方法的閉包。
數(shù)據(jù)庫驅(qū)動(dòng)程序可靠性
當(dāng)使用數(shù)據(jù)庫隊(duì)列驅(qū)動(dòng)程序?qū)⒆鳂I(yè)釋放回隊(duì)列時(shí),Laravel 現(xiàn)在將在事務(wù)內(nèi)執(zhí)行操作。這意味著除非添加了新的已發(fā)布實(shí)例,否則不會(huì)從隊(duì)列中刪除作業(yè)。這大大減少了作業(yè)失敗的機(jī)會(huì)。
Redis 驅(qū)動(dòng)程序效率
當(dāng)使用 Redis 隊(duì)列驅(qū)動(dòng)程序批量分發(fā)一組作業(yè)時(shí), Laravel 將通過向 Redis 發(fā)送單個(gè)命令來執(zhí)行操作。以前, Laravel曾經(jīng)向 Redis 發(fā)送多個(gè) rpush
命令,每個(gè)作業(yè)一個(gè)。
Worker 優(yōu)雅終止
從 Laravel 8 開始, Workers 將優(yōu)雅退出,并調(diào)用由 App::Terminating()
注冊(cè)的任何終止回調(diào)。
Worker 自我終止
為了避免內(nèi)存泄漏,通常的做法是不時(shí)終止您的工作程序,然后讓您的過程監(jiān)視工具啟動(dòng)新的工作程序。通常是通過添加一個(gè)運(yùn)行 queue:restart
令的CRON作業(yè)來完成的。
在 Laravel 8中,您可以指示 Workers 在處理了一定數(shù)量的作業(yè)或運(yùn)行了特定的秒數(shù)后退出:
php artisan queue:work --max-jobs=1000 --max-time=3600
命名 Workers
你現(xiàn)在添加 --name
選項(xiàng)到 queue:work
命令:
php artisan queue:work --name=notifications
添加此功能的主要目的是允許人們自定義 Workers 在運(yùn)行時(shí)如何選擇哪個(gè)隊(duì)列來處理任務(wù):
Worker::popUsing('notifications', function ($pop) { $queues = time()->atNight() ? ['mail', 'webhooks'] : ['push-notifications', 'sms', 'mail', 'webhooks']; foreach ($queues as $queue) { if (! is_null($job = $pop($queue))) { return $job; } } });
任務(wù)批處理
Laravel 的任務(wù)批處理使您可以分派許多任務(wù),以供您的 Workers 并行處理。 您可以在批處理中的所有任務(wù)都處理完畢或任何批處理任務(wù)失敗后執(zhí)行操作:
Bus::batch([ new ProcessFile(1), new ProcessFile(2), new ProcessFile(3), ])->dispatch();
您可以在官方文檔中找到有關(guān)“作業(yè)批處理”的更多信息。
作業(yè)鏈
您現(xiàn)在可以使用 Bus
直接調(diào)度一系列作業(yè):
Bus::chain([ new ExtractReports, new GenerateReport, new SendResults, ])->dispatch();
您還可以添加一個(gè) catch()
回調(diào),如果鏈中的任何作業(yè)失敗都會(huì)被調(diào)用:
Bus::chain([ new ExtractReports, new GenerateReport, new SendResults, ])->catch(function(){ // Handle the chain failure. }) ->dispatch();
Horizon 平衡率
Horizon 中添加了兩個(gè)新的配置選項(xiàng): balanceMaxShift
and balanceCooldown
。
'environments' => [ 'environment' => [ 'supervisor-1' => [ 'balanceMaxShift' => 5, ], ], ],
balanceMaxShift
設(shè)置每次 Horizon 擴(kuò)展工作程序池時(shí)要添加或刪除的工作進(jìn)程數(shù)。在 Horizon 的早期版本中,僅添加或刪除了一個(gè)工作進(jìn)程,現(xiàn)在您可以控制該數(shù)目。
至于 balanceCooldown
,它設(shè)置每個(gè)縮放操作之間等待的秒數(shù)。在 Horizon 的早期版本中,這被硬編碼為3秒。
'environments' => [ 'environment' => [ 'supervisor-1' => [ 'balanceCooldown' => 1, ], ], ],
原文地址:https://dev.to/themsaid/features-and-changes-coming-to-laravel-8-s-queue-system-5amg
譯文地址:https://learnku.com/laravel/t/50086