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

 
(같은 사용자의 중간 판 19개는 보이지 않습니다)
24번째 줄: 24번째 줄:
===Job 겹침 방지===
===Job 겹침 방지===
===예외 쓰로틀링===
===예외 쓰로틀링===
==Job 디스패치==
==작업 디스패치==
===지연된 디스패치===
===지연된 디스패치===
===동기식 디스패치===
===동기식 디스패치===
===Jobs & 데이터베이스 트랜잭션===
===작업 & 데이터베이스 트랜잭션===
===Job 체인===
===작업 체인===
===큐 및 연결 커스터마이징===
===큐 및 연결 커스터마이징===
Specifying Max Job Attempts / Timeout Values
===최대 작업 시도 / 타임아웃 값 지정하기===
Error Handling
===에러 핸들링===
==Job 배치==
 
===배치가능 Job 정의===
==작업 배치==
===배치가능 작업 정의===
===배치 디스패치===
===배치 디스패치===
===체인과 배치===
===체인과 배치===
===배치에 Job 추가===
===배치에 Job 추가===
===배치 조사===
===배치 조사===
===배치 취소====
===배치 취소===
===배치 실패====
===배치 실패===
===배치 솎아내기===
===배치 솎아내기===
===배치를 DynamoDB에 저장하기===
===배치를 DynamoDB에 저장하기===
==큐잉 클로저==
==큐잉 클로저==
==큐 워커 구동==
==큐 워커 구동==
===The queue:work Command
===<code>queue:work</code> 명령어===
===Queue Priorities
===큐 우선수위===
===Queue Workers and Deployment
===큐 워커와 배포===
===Job Expirations and Timeouts
===작업 만료와 타임아웃===
 
==Supervisor 설정==
==Supervisor 설정==
==실패한 Job 다루기==
==실패한 작업 다루기==
===실패한 Job 후 클린업===
===실패한 작업 이후 클린업===
===실패한 Job 재시도===
===실패한 작업 재시도===
===누락된 모델 무시하기===
===누락된 모델 무시하기===
===실패한 Job 솎아내기===
===실패한 작업 솎아내기===
===실패한 Job을 DynamoDB에 저장하기===
===실패한 작업을 DynamoDB에 저장하기===
===실패한 Job 스토리지 비활성화하기===
===실패한 작업 저장 비활성화하기===
===실패한 Job 이벤트===
===실패한 작업 이벤트===
==큐에서 Job 클리어===
 
==큐에서 작업 클리어==
 
==큐 모니터링==
==큐 모니터링==
==테스트==
==테스트==
===Job의 부분집합 페이크===
===Job의 부분집합 페이크===
=== Job 체인 테스트===
===작업 체인 테스트===
===Job 배치 테스트===
<code>Bus</code> 퍼사드의 <code>assertBatched</code> 메소드는 작업 배치(batch of jobs)가 디스패치되었는지 확인(assert)하는 데 사용할 수 있습니다. <code>assertBatched</code> 메소드에 제공된 클로저는 <code>Illuminate\Bus\PendingBatch</code> 인스턴스를 받으며, 이 인스턴스를 사용하여 배치 내의 작업(job)을 검사할 수 있습니다:
===Job / 큐 상호작용 테스트===
 
==Job 이벤트==
<syntaxhighlight lang='php'>
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;
});
</syntaxhighlight>
 
<code>assertBatchCount</code> 메소드를 사용하여 특정 수의 배치가 디스패치되었는지 확인(assert)할 수 있습니다:
 
<syntaxhighlight lang='php'>
Bus::assertBatchCount(3);
</syntaxhighlight>
 
<code>assertNothingBatched</code> 메소드를 사용하여 아무 배치도 디스패치되지 않았는지 확인(assert)할 수 있습니다:
 
<syntaxhighlight lang='php'>
Bus::assertNothingBatched();
</syntaxhighlight>
 
====작업 / 배치 테스트====
또한, 개별 작업이 기본 배치와 상호작용하는 방식을 테스트해야 할 때가 있습니다. 예를 들어, 작업이 해당 배치의 추가 처리를 취소했는지 테스트해야 할 수 있습니다. 이를 수행하기 위해 <code>withFakeBatch</code> 메소드를 통해 작업에 페이크(fake) 배치를 할당해야 합니다. <code>withFakeBatch</code> 메소드는 작업 인스턴스와 페이크 배치를 포함하는 튜플을 반환합니다.
 
<syntaxhighlight lang='php'>
[$job, $batch] = (new ShipOrder)->withFakeBatch();
$job->handle();
$this->assertTrue($batch->cancelled());
$this->assertEmpty($batch->added);
</syntaxhighlight>
 
===작업 / 큐 상호작용 테스트===
때로는, 대기 중인 작업이 [[#작업 수동 릴리스|다시 큐에 자신을 릴리스하는지]] 테스트해야 할 때가 있습니다. 또는 작업이 자신을 삭제했는지 테스트해야 할 수도 있습니다. 이러한 큐 상호작용을 테스트하려면 작업을 인스턴스화하고 <code>withFakeQueueInteractions</code> 메소드를 호출할 수 있습니다.
 
작업의 큐 상호작용이 페이크로 설정되면, 작업에서 <code>handle</code> 메소드를 호출할 수 있습니다. 작업을 호출한 후에는 <code>assertReleased</code>, <code>assertDeleted</code>, <code>assertFailed</code> 메소드를 사용하여 작업의 큐 상호작용에 대한 어썰션을 할 수 있습니다.
 
<syntaxhighlight lang='php'>
use App\Jobs\ProcessPodcast;
$job = (new ProcessPodcast)->withFakeQueueInteractions();
$job->handle();
$job->assertReleased(delay: 30);
$job->assertDeleted();
$job->assertFailed();
</syntaxhighlight>
 
==작업 이벤트==
<code>Queue</code> [[Laravel 퍼사드|퍼사드]]의 <code>before</code>와 <code>after</code> 메소드를 사용하여 큐에 등록된 작업이 처리되기 전이나 후에 실행할 콜백을 지정할 수 있습니다. 이러한 콜백은 추가 로깅을 수행하거나 대시보드를 위한 통계를 증가시키는 좋은 기회입니다. 일반적으로 이러한 메소드는 [[Laravel 프로바이더|서비스 제공자]]의 <code>boot</code> 메소드에서 호출해야 합니다. 예를 들어, Laravel에 포함된 <code>AppServiceProvider</code>를 사용할 수 있습니다:
<code>Queue</code> [[Laravel 퍼사드|퍼사드]]의 <code>before</code>와 <code>after</code> 메소드를 사용하여 큐에 등록된 작업이 처리되기 전이나 후에 실행할 콜백을 지정할 수 있습니다. 이러한 콜백은 추가 로깅을 수행하거나 대시보드를 위한 통계를 증가시키는 좋은 기회입니다. 일반적으로 이러한 메소드는 [[Laravel 프로바이더|서비스 제공자]]의 <code>boot</code> 메소드에서 호출해야 합니다. 예를 들어, Laravel에 포함된 <code>AppServiceProvider</code>를 사용할 수 있습니다:


106번째 줄: 166번째 줄:
}
}
</syntaxhighlight>
</syntaxhighlight>
<code>Queue</code> [[Laravel 퍼사드|퍼사드]]의 <code>looping</code> 메소드를 사용하여 워커가 큐에서 작업을 가져오려고 시도하기 전에 실행되는 콜백을 지정할 수 있습니다. 예를 들어, 이전에 실패한 작업이 남긴 트랜잭션을 롤백하기 위해 클로저를 등록할 수 있습니다:
<syntaxhighlight lang='php'>
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Queue;
Queue::looping(function () {
    while (DB::transactionLevel() > 0) {
        DB::rollBack();
    }
});
</syntaxhighlight>
==같이 보기==
* [[라라벨 큐 이야기]]


==참고==
==참고==
* https://laravel.com/docs/11.x/queues
* https://laravel.com/docs/11.x/queues


[[분류: Laravel]]
[[분류: 라라벨 큐]]
[[분류: 큐]]

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