Die folgende Tutorial-Kolumne von Laravel stellt Ihnen die neuen Funktionen und Änderungen des Laravel 8-Warteschlangensystems vor. Ich hoffe, dass es Freunden in Not hilfreich sein wird!
Laravel 8 kommt mit coolen neuen Funktionen und einigen Änderungen am Warteschlangensystem. In diesem Artikel werden wir uns diese Funktionen und Änderungen ansehen.
Änderungen
Backoff
Methode retryAfter()
und retryAfter
hinzugefügt, um Jobs, E-Mails, Benachrichtigungen und Listener in die Warteschlange zu stellen. Die Eigenschaft wird in 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();
Horizon 平衡率
Horizon 中添加了两个新的配置选项: balanceMaxShift
and balanceCooldown
。
'environments' => [ 'environment' => [ 'supervisor-1' => [ 'balanceMaxShift' => 5, ], ], ],
balanceMaxShift
设置每次 Horizon 扩展工作程序池时要添加或删除的最大工作进程数。在 Horizon 的早期版本中,仅添加或删除了一个工作进程,现在您可以控制该数目。
至于 balanceCooldown
--delay
des Befehls php artisan queue:work
wurde ebenfalls in --backoff
umbenannt. 🎜🎜Sie sollten auch wissen, dass Sie jetzt ein Array an das Attribut backoff
übergeben können, um den Worker anzuweisen, einen exponentiellen Backoff zu implementieren: 🎜'environments' => [ 'environment' => [ 'supervisor-1' => [ 'balanceCooldown' => 1, ], ], ],
backoff()
gibt ein Array zurück: 🎜rrreee🎜 Mithilfe des exponentiellen Backoffs weisen wir den Worker an, die Wiederholung des Auftrags um 30 Sekunden nach dem ersten Fehler und dann 60 Sekunden nach jedem Fehler zu verzögern. 🎜🎜Sie können auch einen exponentiellen Backoff für den Befehl queue:work
verwenden: 🎜rrreee🎜🎜Jobablauf🎜🎜🎜timeoutAt
-Attribut für in der Warteschlange befindliche Jobs, Benachrichtigungen und Listener. Umbenannt in retryUntil. 🎜🎜Verwenden Sie $retryUntil
, um den Worker anzuweisen, den Job bis zu einem späteren Zeitpunkt erneut zu versuchen. 🎜🎜Sie können retryUntil
als öffentliche Eigenschaft der Jobklasse oder als retryUntil
-Methode hinzufügen: 🎜rrreee🎜🎜Neue Funktionen🎜🎜🎜🎜Warteschlangenschließung🎜🎜🎜Sie kann jetzt catch()
-Methoden verketten, wenn Warteschlangenabschlüsse ausgelöst werden: 🎜rrreee🎜Wenn der Job fehlschlägt, wird der für die catch()
-Methode bereitgestellte Abschluss aufgerufen. 🎜🎜🎜Zuverlässigkeit des Datenbanktreibers🎜🎜🎜 Laravel führt jetzt Vorgänge innerhalb einer Transaktion aus, wenn der Datenbankwarteschlangentreiber verwendet wird, um einen Job wieder in die Warteschlange freizugeben. Dies bedeutet, dass Aufträge nicht aus der Warteschlange entfernt werden, es sei denn, eine neue veröffentlichte Instanz wird hinzugefügt. Dies verringert die Wahrscheinlichkeit eines Arbeitsausfalls erheblich. 🎜🎜🎜Effizienz des Redis-Treibers🎜🎜🎜Wenn Sie den Redis-Warteschlangentreiber zur Stapelverteilung einer Reihe von Jobs verwenden, führt Laravel den Vorgang aus, indem es einen einzelnen Befehl an Redis sendet. Zuvor sendete Laravel mehrere rpush
-Befehle an Redis, einen für jeden Job. 🎜🎜🎜Geltungsvolle Beendigung des Workers🎜🎜🎜 Ab Laravel 8 beenden Worker ordnungsgemäß und rufen alle von App::Terminating()
registrierten Beendigungsrückrufe auf. 🎜🎜🎜Worker selbstbeendend 🎜🎜🎜Um Speicherlecks zu vermeiden, ist es üblich, Ihre Worker von Zeit zu Zeit zu beenden und dann Ihr Prozessüberwachungstool einen neuen Worker starten zu lassen. Dies geschieht normalerweise durch Hinzufügen eines CRON-Jobs, der den Befehl queue:restart
ausführt. 🎜🎜In Laravel 8 können Sie Worker anweisen, nach der Verarbeitung einer bestimmten Anzahl von Jobs oder nach einer bestimmten Anzahl von Sekunden zu beenden: 🎜rrreee🎜🎜Named Workers🎜🎜🎜Sie fügen jetzt --name
hinzu Optionen für den Befehl queue:work
: 🎜rrreee🎜Der Hauptzweck des Hinzufügens dieser Funktion besteht darin, Benutzern die Möglichkeit zu geben, anzupassen, wie Worker auswählen, welche Warteschlange Aufgaben zur Laufzeit verarbeiten sollen: 🎜rrreee🎜🎜Aufgabenstapelung🎜🎜 🎜 Mit der Aufgabenstapelung von Laravel können Sie viele Aufgaben zur parallelen Verarbeitung durch Ihre Mitarbeiter verteilen. Sie können Aktionen ausführen, nachdem alle Aufgaben im Stapel verarbeitet wurden oder eine Stapelaufgabe fehlgeschlagen ist: 🎜rrreee🎜 Sie können dies unter Weitere Informationen zu Job Batching finden Sie in der offiziellen Dokumentation 🎜. 🎜🎜🎜Jobketten🎜🎜🎜Sie können jetzt eine Reihe von Jobs direkt mit Bus
planen: 🎜rrreee🎜Sie können auch einen catch()
-Rückruf hinzufügen, wenn es sich um einen beliebigen Job handelt Der Fehler wird aufgerufen: 🎜rrreee🎜🎜Horizon Balance Rate 🎜🎜🎜Zwei neue Konfigurationsoptionen wurden zu Horizon hinzugefügt: balanceMaxShift
und balanceCooldown
. 🎜rrreee🎜balanceMaxShift
Legt die maximale Anzahl von Worker-Prozessen fest, die jedes Mal hinzugefügt oder entfernt werden, wenn Horizon den Worker-Pool erweitert. In früheren Versionen von Horizon wurde nur ein Arbeitsprozess hinzugefügt oder entfernt, jetzt können Sie diese Anzahl steuern. 🎜🎜Was balanceCooldown
betrifft, so wird die Anzahl der Sekunden festgelegt, die zwischen den einzelnen Skalierungsvorgängen gewartet werden soll. In früheren Versionen von Horizon war dies fest auf 3 Sekunden codiert. 🎜'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
Das obige ist der detaillierte Inhalt vonNeue Funktionen und Änderungen im Warteschlangensystem von Laravel 8. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!