다음 튜토리얼 칼럼인 Laravel에서는 Laravel 8 큐 시스템의 새로운 기능과 변경 사항을 소개할 예정입니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!
Laravel 8에는 멋진 새 기능과 대기열 시스템에 대한 일부 변경 사항이 포함되어 있습니다. 이번 글에서는 이러한 기능과 변경 사항을 살펴보겠습니다.
Changes
Backoff
작업, 이메일, 알림 및 리스너를 대기열에 추가하기 위해 retryAfter()
메서드 및 retryAfter
를 추가했습니다. 속성 이름은 백오프. 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
php artisan queue:work
명령의 --delay
옵션도 --backoff
로 이름이 변경되었습니다. 🎜🎜이제 backoff
속성에 배열을 전달하여 작업자에게 지수 백오프를 구현하도록 지시할 수 있다는 점도 알아야 합니다. 🎜'environments' => [ 'environment' => [ 'supervisor-1' => [ 'balanceCooldown' => 1, ], ], ],
backoff()
에서 메서드 🎜rrreee🎜 여기서 지수 백오프를 사용하여 첫 번째 실패 후 30초 동안 작업 재시도를 지연하고 각 실패 후 60초 동안 작업 재시도를 지연하도록 작업자에게 지시합니다. 🎜🎜queue:work
명령에서 지수 백오프를 사용할 수도 있습니다. 🎜rrreee🎜🎜Jobexpiration🎜🎜🎜timeoutAt
속성은 대기 중인 작업, 알림 및 리스너에 대해 retryUntil. 🎜🎜$retryUntil
을 사용하여 작업자에게 향후 일정 시간까지 작업을 계속해서 재시도하도록 지시하세요. 🎜🎜retryUntil
을 작업 클래스의 공개 속성으로 또는 retryUntil
메서드로 추가할 수 있습니다. 🎜rrreee🎜🎜새 기능🎜🎜🎜🎜Queue Closure🎜🎜🎜You 이제 대기열 클로저를 디스패치할 때 catch()
메서드를 연결할 수 있습니다. 🎜rrreee🎜작업이 실패하면 catch()
메서드에 제공된 클로저가 호출됩니다. 🎜🎜🎜데이터베이스 드라이버 신뢰성🎜🎜🎜 Laravel은 이제 데이터베이스 큐 드라이버를 사용하여 작업을 큐에 다시 릴리스할 때 트랜잭션 내에서 작업을 수행합니다. 이는 새로 게시된 인스턴스가 추가되지 않는 한 작업이 대기열에서 제거되지 않음을 의미합니다. 이는 취업 실패 가능성을 크게 줄여줍니다. 🎜🎜🎜Redis 드라이버 효율성🎜🎜🎜Redis 큐 드라이버를 사용하여 일련의 작업을 일괄 배포할 때 Laravel은 Redis에 단일 명령을 보내 작업을 수행합니다. 이전에 Laravel은 각 작업마다 하나씩 여러 rpush
명령을 Redis에 보냈습니다. 🎜🎜🎜Worker 우아한 종료🎜🎜🎜 Laravel 8부터 Workers는 정상적으로 종료되고 App::Terminating()
에 의해 등록된 모든 종료 콜백을 호출합니다. 🎜🎜🎜Worker 자체 종료 🎜🎜🎜메모리 누수를 방지하려면 때때로 작업자를 종료한 다음 프로세스 모니터링 도구가 새 작업자를 시작하도록 하는 것이 일반적인 관행입니다. 이는 일반적으로 queue:restart
명령을 실행하는 CRON 작업을 추가하여 수행됩니다. 🎜🎜Laravel 8에서는 특정 수의 작업을 처리하거나 특정 초 동안 실행한 후 작업자에게 종료하도록 지시할 수 있습니다. 🎜rrreee🎜🎜Named Workers🎜🎜🎜이제 --name
을 추가합니다. queue:work
명령에 대한 옵션: 🎜rrreee🎜이 기능을 추가하는 주요 목적은 작업자가 런타임에 작업을 처리할 대기열을 선택하는 방법을 사용자 정의할 수 있도록 하는 것입니다. 🎜rrreee🎜🎜작업 일괄 처리🎜🎜 🎜 Laravel의 작업 일괄 처리를 사용하면 작업자의 병렬 처리를 위해 많은 작업을 파견할 수 있습니다. 배치의 모든 작업이 처리된 후 또는 배치 작업이 실패한 후에 작업을 수행할 수 있습니다. 🎜rrreee🎜 공식 문서 🎜에서 작업 일괄 처리에 대한 자세한 내용을 찾아보세요. 🎜🎜🎜작업 체인🎜🎜🎜이제 버스
를 사용하여 일련의 작업을 직접 예약할 수 있습니다. 🎜rrreee🎜체인이 Any인 경우 catch()
콜백을 추가할 수도 있습니다. 작업 실패가 호출됩니다. 🎜rrreee🎜🎜Horizon Balance Rate 🎜🎜🎜Horizon에 두 가지 새로운 구성 옵션인 balanceMaxShift
및 balanceCooldown
이 추가되었습니다. 🎜rrreee🎜balanceMaxShift
Horizon이 작업자 풀을 확장할 때마다 추가하거나 제거할 최대 작업자 프로세스 수를 설정합니다. 이전 버전의 Horizon에서는 작업자 프로세스가 하나만 추가되거나 제거되었으므로 이제 해당 수를 제어할 수 있습니다. 🎜🎜balanceCooldown
의 경우 각 조정 작업 사이에 대기하는 시간(초)을 설정합니다. 이전 버전의 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
위 내용은 Laravel 8 대기열 시스템의 새로운 기능 및 변경 사항의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!