Laravel 8의 대기열 시스템에 적용되는 기능 및 변경 사항

10480 단어 laravel
Laravel 8에는 멋진 새 기능과 대기열 시스템에 대한 몇 가지 변경 사항이 포함되어 있습니다. 이 게시물에서는 이러한 기능과 변경 사항을 살펴보겠습니다.

변경 사항



물러나 다


retryAfter() 메서드와 대기 중인 작업, 메일러, 알림 및 수신기의 retryAfter 속성이 backoff 로 이름이 변경되었습니다.
--delay 명령의 php artisan queue:work 옵션도 --backoff로 이름이 변경되었습니다.

또한 이제 작업자에게 지수 백오프를 구현하도록 지시하기 위해 backoff 속성에 배열을 전달할 수 있다는 것도 알아야 합니다.

public $backoff = [30, 60];

또는 backoff() 메서드에서 배열을 반환합니다.

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

여기에서 지수 백오프를 사용하여 작업자에게 첫 번째 실패 후 작업 재시도를 30초 지연하고 그 후 각 실패에 대해 60초를 지연하도록 지시했습니다.
queue:work 명령에 지수 백오프를 사용할 수도 있습니다.

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

작업 만료



대기 중인 작업, 알림 및 리스너의 timeoutAt 속성이 retryUntil 로 이름이 변경되었습니다.
$retryUntil를 사용하면 작업자가 미래의 특정 시간까지 작업을 계속 재시도하도록 지시합니다.

작업 클래스 또는 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은 여러 명령rpush을 redis에 보내는 데 사용되었습니다. 각 작업에 대해 하나씩.

작업자 정상 종료



Laravel 8부터 작업자는 정상적으로 종료되고 App::terminating() 에 의해 등록된 종료 콜백을 호출합니다.

근로자 자기 종료



메모리 누수를 방지하기 위해 때때로 작업자를 종료하고 프로세스 모니터링 도구가 새 작업자를 시작하도록 하는 것이 일반적입니다. 이것은 일반적으로 queue:restart artisan 명령을 실행하는 CRON 작업을 추가하여 수행되었습니다.

Laravel 8에서는 특정 수의 작업을 처리한 후 또는 특정 시간(초) 동안 실행한 후 작업자에게 종료하도록 지시할 수 있습니다.

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

작업자 이름 지정



이제 --name 명령에 queue:work 옵션을 추가할 수 있습니다.

php artisan queue:work --name=notifications

이 기능은 주로 작업자가 런타임에 작업을 처리할 대기열을 선택하는 방법을 사용자 지정할 수 있도록 추가되었습니다.

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의 작업 일괄 처리를 사용하면 작업자가 병렬로 처리할 여러 작업을 파견할 수 있습니다. 배치의 모든 작업이 처리된 후 또는 배치 작업 중 하나가 실패한 경우 작업을 수행할 수 있습니다.

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

작업 일괄 처리에 대한 자세한 내용은 official documentation 에서 찾을 수 있습니다.

작업 체인



이제 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에 추가되었습니다. balanceMaxShiftbalanceCooldown .

 'environments' => [
    'environment' => [
        'supervisor-1' => [
            'balanceMaxShift' => 5,
        ],
    ],
],
balanceMaxShift Horizon이 작업자 풀을 확장할 때마다 추가하거나 제거할 작업자 프로세스의 최대 수를 설정합니다. Horizon의 이전 버전에서는 단일 작업자만 추가되거나 제거되었지만 이제 해당 수를 제어할 수 있습니다.
balanceCooldown 의 경우 각 스케일링 작업 사이에 대기할 시간(초)을 설정합니다. 이는 이전 버전의 Horizon에서 3초로 하드 코딩되었습니다.

 'environments' => [
    'environment' => [
        'supervisor-1' => [
            'balanceCooldown' => 1,
        ],
    ],
],

좋은 웹페이지 즐겨찾기