"Laravel 큐"의 두 판 사이의 차이

61번째 줄: 61번째 줄:
===실패한 작업 이벤트===
===실패한 작업 이벤트===


==큐에서 Job 클리어===
==큐에서 작업 클리어==
 
==큐 모니터링==
==큐 모니터링==
==테스트==
==테스트==

2024년 5월 22일 (수) 01:35 판

1 개요

라라벨 Queues
Laravel 큐

2 소개

웹 애플리케이션을 구축하는 동안, CSV 파일을 파싱하고 저장하는 것과 같이 일반적인 웹 요청 동안 처리하기에는 시간이 너무 오래 걸리는 작업이 있을 수 있습니다. 다행히도, Laravel을 사용하면 이러한 작업을 백그라운드에서 처리할 수 있는 큐된 작업을 쉽게 만들 수 있습니다. 시간이 많이 소요되는 작업을 큐로 옮김으로써 애플리케이션이 웹 요청에 신속하게 응답하고 사용자에게 더 나은 경험을 제공할 수 있습니다.

Laravel 큐는 Amazon SQS, Redis, 또는 관계형 데이터베이스와 같은 다양한 큐 백엔드에서 통합된 큐 API를 제공합니다.

Laravel의 큐 설정 옵션은 애플리케이션의 config/queue.php 설정 파일에 저장됩니다. 이 파일에서 데이터베이스, Amazon SQS, Redis, Beanstalkd 드라이버를 포함하여 프레임워크에 포함된 각 큐 드라이버에 대한 연결 설정을 찾을 수 있습니다. 또한, 즉시 작업을 실행하는 동기 드라이버(로컬 개발 시 사용)와 큐에 추가된 작업을 폐기하는 null 큐 드라이버도 포함되어 있습니다.

이제 Laravel은 Redis 기반 큐를 위한 아름다운 대시보드 및 구성 시스템인 Horizon을 제공합니다. 자세한 내용은 전체 Horizon 문서를 참조하십시오.

2.1 연결 vs 큐

2.2 드라이버 노트와 전제조건

3 Job 생성

3.1 Job 클래스 생성

3.2 클래스 구조

3.3 유니크 Job

3.4 암호화된 Job

4 Job 미들웨어

4.1 레이트 리미팅

4.2 Job 겹침 방지

4.3 예외 쓰로틀링

5 작업 디스패치

5.1 지연된 디스패치

5.2 동기식 디스패치

5.3 작업 & 데이터베이스 트랜잭션

5.4 작업 체인

5.5 큐 및 연결 커스터마이징

5.6 최대 작업 시도 / 타임아웃 값 지정하기

5.7 에러 핸들링

6 작업 배치

6.1 배치가능 작업 정의

6.2 배치 디스패치

6.3 체인과 배치

6.4 배치에 Job 추가

6.5 배치 조사

6.6 배치 취소

6.7 배치 실패

6.8 배치 솎아내기

6.9 배치를 DynamoDB에 저장하기

7 큐잉 클로저

8 큐 워커 구동

8.1 queue:work 명령어

8.2 큐 우선수위

8.3 큐 워커와 배포

8.4 작업 만료와 타임아웃

9 Supervisor 설정

10 실패한 작업 다루기

10.1 실패한 작업 이후 클린업

10.2 실패한 작업 재시도

10.3 누락된 모델 무시하기

10.4 실패한 작업 솎아내기

10.5 실패한 작업을 DynamoDB에 저장하기

10.6 실패한 작업 저장 비활성화하기

10.7 실패한 작업 이벤트

11 큐에서 작업 클리어

12 큐 모니터링

13 테스트

13.1 Job의 부분집합 페이크

13.2 작업 체인 테스트

Bus 퍼사드의 assertBatched 메소드는 작업 배치(batch of jobs)가 디스패치되었는지 확인(assert)하는 데 사용할 수 있습니다. assertBatched 메소드에 제공된 클로저는 Illuminate\Bus\PendingBatch 인스턴스를 받으며, 이 인스턴스를 사용하여 배치 내의 작업(job)을 검사할 수 있습니다:

use Illuminate\Bus\PendingBatch;
use Illuminate\Support\Facades\Bus;
 
Bus::fake();
 
// ...
 
Bus::assertBatched(function (PendingBatch $batch) {
    return $batch->name == 'import-csv' &&
           $batch->jobs->count() === 10;
});

assertBatchCount 메소드를 사용하여 특정 수의 배치가 디스패치되었는지 확인(assert)할 수 있습니다:

Bus::assertBatchCount(3);

assertNothingBatched 메소드를 사용하여 아무 배치도 디스패치되지 않았는지 확인(assert)할 수 있습니다:

Bus::assertNothingBatched();

13.2.1 작업 / 배치 테스트

또한, 개별 작업이 기본 배치와 상호작용하는 방식을 테스트해야 할 때가 있습니다. 예를 들어, 작업이 해당 배치의 추가 처리를 취소했는지 테스트해야 할 수 있습니다. 이를 수행하기 위해 withFakeBatch 메소드를 통해 작업에 페이크(fake) 배치를 할당해야 합니다. withFakeBatch 메소드는 작업 인스턴스와 페이크 배치를 포함하는 튜플을 반환합니다.

[$job, $batch] = (new ShipOrder)->withFakeBatch();
 
$job->handle();
 
$this->assertTrue($batch->cancelled());
$this->assertEmpty($batch->added);

13.3 작업 / 큐 상호작용 테스트

때로는, 대기 중인 작업이 다시 큐에 자신을 릴리스하는지 테스트해야 할 때가 있습니다. 또는 작업이 자신을 삭제했는지 테스트해야 할 수도 있습니다. 이러한 큐 상호작용을 테스트하려면 작업을 인스턴스화하고 withFakeQueueInteractions 메소드를 호출할 수 있습니다.

작업의 큐 상호작용이 페이크로 설정되면, 작업에서 handle 메소드를 호출할 수 있습니다. 작업을 호출한 후에는 assertReleased, assertDeleted, assertFailed 메소드를 사용하여 작업의 큐 상호작용에 대한 어썰션을 할 수 있습니다.

use App\Jobs\ProcessPodcast;
 
$job = (new ProcessPodcast)->withFakeQueueInteractions();
 
$job->handle();
 
$job->assertReleased(delay: 30);
$job->assertDeleted();
$job->assertFailed();

14 작업 이벤트

Queue 퍼사드beforeafter 메소드를 사용하여 큐에 등록된 작업이 처리되기 전이나 후에 실행할 콜백을 지정할 수 있습니다. 이러한 콜백은 추가 로깅을 수행하거나 대시보드를 위한 통계를 증가시키는 좋은 기회입니다. 일반적으로 이러한 메소드는 서비스 제공자boot 메소드에서 호출해야 합니다. 예를 들어, Laravel에 포함된 AppServiceProvider를 사용할 수 있습니다:

<?php
 
namespace App\Providers;
 
use Illuminate\Support\Facades\Queue;
use Illuminate\Support\ServiceProvider;
use Illuminate\Queue\Events\JobProcessed;
use Illuminate\Queue\Events\JobProcessing;
 
class AppServiceProvider extends ServiceProvider
{
    /**
     * 애플리케이션 서비스 등록.
     */
    public function register(): void
    {
        // ...
    }
 
    /**
     * 애플리케이션 서비스 부트스트랩.
     */
    public function boot(): void
    {
        Queue::before(function (JobProcessing $event) {
            // $event->connectionName
            // $event->job
            // $event->job->payload()
        });
 
        Queue::after(function (JobProcessed $event) {
            // $event->connectionName
            // $event->job
            // $event->job->payload()
        });
    }
}

Queue 퍼사드looping 메소드를 사용하여 워커가 큐에서 작업을 가져오려고 시도하기 전에 실행되는 콜백을 지정할 수 있습니다. 예를 들어, 이전에 실패한 작업이 남긴 트랜잭션을 롤백하기 위해 클로저를 등록할 수 있습니다:

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Queue;
 
Queue::looping(function () {
    while (DB::transactionLevel() > 0) {
        DB::rollBack();
    }
});

15 같이 보기

16 참고

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}