首頁  >  文章  >  php框架  >  Laravel 8 隊列系統的新功能與變化

Laravel 8 隊列系統的新功能與變化

藏色散人
藏色散人轉載
2020-09-27 13:40:542950瀏覽

以下由Laravel教學專欄為大家介紹Laravel 8 佇列系統的新功能和變化,希望對需要的朋友有幫助!

Laravel 8 隊列系統的新功能與變化

Laravel 8 中搭配了酷炫的新特性,並對佇列系統的某些變更。在本文中,我們將研究這些特性和變更。

變化


Backoff (回退)

已將retryAfter() 方法和retryAfter 排隊作業,郵件,通知和偵聽器的屬性重新命名為backoff

php artisan queue:work 指令的 --delay 選項也已重新命名為 --backoff

您也應該知道,現在可以將陣列傳遞給backoff 屬性,以指示worker 實作指數回退(exponential backoff):

public $backoff = [30, 60];

或從 backoff() 方法傳回一個陣列:

public function backoff()
{
    return [30, 60]; 
}

在這裡使用指數回退,我們指示worker 在第一次失敗後延遲30 秒重試作業,然後在每次失敗後延遲60 秒。

您也可以在queue:work 指令上使用指數回退:

php artisan queue:Work --backoff=30,60

作業過期

排隊作業,通知和偵聽器的timeoutAt 屬性已重新命名為retryUntil

使用 $retryUntil 指示 worker 繼續重試作業,直到將來的某個時間。

您可以將retryUntil 作為作業類別的公共屬性或retryUntil 方法新增:

public function retryUntil()
{
    return now()->addDay();
}

新功能

#佇列閉包

您現在可以在調度佇列閉包時鍊式呼叫catch() 方法:

dispatch(function () {
    // Job logic...
})->catch(function (Throwable $e) {
    // Handle Failure...
});

如果作業失敗,將呼叫提供給catch() 方法的閉包。

資料庫驅動程式可靠性

當使用資料庫佇列驅動程式將作業釋放回佇列時,Laravel 現在將在交易內執行操作。這意味著除非新增了新的已發佈實例,否則不會從佇列中刪除作業。這大大減少了作業失敗的機會。

Redis 驅動程式效率

當使用 Redis 佇列驅動程式批次分發一組作業時, Laravel 將透過向 Redis 發送單一指令來執行操作。以前, Laravel曾經向 Redis 發送多個 rpush 指令,每個作業一個。

Worker 優雅終止

從Laravel 8 開始, Workers 將優雅退出,並呼叫由App::Terminating() 註冊的任何終止回調。

Worker 自我終止

為了避免記憶體洩漏,通常的做法是不時終止您的工作程序,然後讓您的過程監視工具啟動新的工作程序。通常是透過新增一個執行 queue:restart 令的CRON作業來完成的。

在Laravel 8中,您可以指示Workers 在處理了一定數量的作業或運行了特定的秒數後退出:

php artisan queue:work --max-jobs=1000 --max-time=3600

命名Workers

#你現在加入 --name 選項到 queue:work 指令:

php artisan queue:work --name=notifications

新增此功能的主要目的是允許人們自訂Workers 在執行時如何選擇哪個佇列來處理任務:

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;
        }
    }
});

任務批次

Laravel 的任務批次可讓您分派許多任務,以供您的Workers 並行處理。您可以在批次中的所有任務都處理完畢或任何批次任務失敗後執行操作:

Bus::batch([
    new ProcessFile(1),
    new ProcessFile(2),
    new ProcessFile(3),
])->dispatch();

您可以在官方文件中找到有關「作業批次」的更多資訊。

作業鏈

您現在可以使用Bus 直接排程一系列作業:

Bus::chain([
    new ExtractReports,
    new GenerateReport,
    new SendResults,
])->dispatch();

您也可以新增一個catch() 回調,如果鏈中的任何作業失敗都會被呼叫:

Bus::chain([
    new ExtractReports,
    new GenerateReport,
    new SendResults,
])->catch(function(){
    // Handle the chain failure.
})
->dispatch();

Horizo​​​​n 平衡率

Horizo​​​​n 中新增了兩個新的設定選項: balanceMaxShift and balanceCooldown

 'environments' => [
    'environment' => [
        'supervisor-1' => [
            'balanceMaxShift' => 5,
        ],
    ],
],

balanceMaxShift 設定每次 Horizo​​​​n 擴充功能集區時要新增或刪除的最大工作進程數。在 Horizo​​​​n 的早期版本中,僅新增或刪除了一個工作進程,現在您可以控制該數目。

至於 balanceCooldown ,它設定每個縮放操作之間等待的秒數。在 Horizo​​​​n 的早期版本中,這被硬編碼為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

以上是Laravel 8 隊列系統的新功能與變化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除