최신 버전에만 새로운 기능이 제공됩니다. 버그 수정은 다음 구성표를 사용하여 제공됩니다.
패키지 버전 | 라라벨 버전 | 버그 수정 기한 | |
---|---|---|---|
13 | 9 | 2023년 8월 8일 | 선적 서류 비치 |
다음 명령을 사용하여 작곡가를 통해 이 패키지를 설치할 수 있습니다.
composer require vladimir-yuldashev/laravel-queue-rabbitmq
패키지가 자동으로 등록됩니다.
config/queue.php
에 연결을 추가합니다:
이것은 RabbitMQ 연결/드라이버가 작동하기 위한 최소 구성입니다.
' connections ' => [
// ...
' rabbitmq ' => [
' driver ' => ' rabbitmq ' ,
' hosts ' => [
[
' host ' => env ( ' RABBITMQ_HOST ' , ' 127.0.0.1 ' ),
' port ' => env ( ' RABBITMQ_PORT ' , 5672 ),
' user ' => env ( ' RABBITMQ_USER ' , ' guest ' ),
' password ' => env ( ' RABBITMQ_PASSWORD ' , ' guest ' ),
' vhost ' => env ( ' RABBITMQ_VHOST ' , ' / ' ),
],
// ...
],
// ...
],
// ...
],
선택적으로 연결 구성에 대기열 옵션을 추가합니다. 이 연결을 위해 생성된 모든 큐는 속성을 가져옵니다.
지연된 메시지의 우선순위를 지정하려면 추가 옵션을 추가하면 됩니다.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' prioritize_delayed ' => false ,
' queue_max_priority ' => 10 ,
],
],
],
// ...
],
라우팅 키를 사용하여 교환에 대해 메시지를 게시하려는 경우 추가 옵션을 추가하면 가능합니다.
amq.direct
교환을 사용합니다.queue
이름이 됩니다.%s
사용하면 queue_name이 대체됩니다.참고: 라우팅 키가 포함된 교환을 사용할 때 바인딩을 사용하여 대기열을 직접 생성할 수도 있습니다.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' exchange ' => ' application-x ' ,
' exchange_type ' => ' topic ' ,
' exchange_routing_key ' => '' ,
],
],
],
// ...
],
Laravel에서는 실패한 작업이 데이터베이스에 저장됩니다. 하지만 다른 프로세스에도 메시지를 사용하여 작업을 수행하도록 지시하고 싶을 수도 있습니다. 실패한 메시지를 교환 또는 특정 대기열로 다시 라우팅하도록 RabbitMQ에 지시하려는 경우 추가 옵션을 추가하면 가능합니다.
amq.direct
교환을 사용합니다.queue
이름으로 대체됩니다. '.failed'
.%s
사용하면 queue_name이 대체됩니다.참고: 라우팅 키와 함께 failed_job 교환을 사용하는 경우 바인딩을 사용하여 교환/큐를 직접 생성해야 할 수도 있습니다.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' reroute_failed ' => true ,
' failed_exchange ' => ' failed-exchange ' ,
' failed_routing_key ' => ' application-x.%s ' ,
],
],
],
// ...
],
8.0부터 이 패키지는 Laravel Horizon을 즉시 지원합니다. 먼저 Horizon을 설치한 다음 RABBITMQ_WORKER
horizon
으로 설정합니다.
Horizon은 작업자가 전달한 이벤트에 따라 달라집니다. 이러한 이벤트는 메시지/작업에 수행된 작업을 Horizon에 알려줍니다.
이 라이브러리는 Horizon을 지원하지만 구성에서 Laravel에 horizon과 호환되는 QueueApi를 사용하도록 알려야 합니다.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
/* Set to "horizon" if you wish to use Laravel Horizon. */
' worker ' => env ( ' RABBITMQ_WORKER ' , ' default ' ),
],
// ...
],
때로는 다른 애플리케이션에서 게시한 메시지로 작업해야 하는 경우도 있습니다.
해당 메시지는 아마도 Laravel의 작업 페이로드 스키마를 따르지 않을 것입니다. 이러한 메시지의 문제점은 Laravel 작업자가 실행할 실제 작업이나 클래스를 결정할 수 없다는 것입니다.
내장된 RabbitMQJob::class
확장하고 대기열 연결 구성 내에서 자신만의 클래스를 정의할 수 있습니다. 자체 클래스 이름으로 구성에서 job
키를 지정하면 브로커에서 검색된 모든 메시지가 자체 클래스로 래핑됩니다.
구성의 예:
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' job ' => App Queue Jobs RabbitMQJob::class,
],
],
],
// ...
],
자신의 직업 클래스의 예:
<?php
namespace App Queue Jobs ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue Jobs RabbitMQJob as BaseJob ;
class RabbitMQJob extends BaseJob
{
/**
* Fire the job.
*
* @return void
*/
public function fire ()
{
$ payload = $ this -> payload ();
$ class = WhatheverClassNameToExecute::class;
$ method = ' handle ' ;
( $ this -> instance = $ this -> resolve ( $ class ))->{ $ method }( $ this , $ payload );
$ this -> delete ();
}
}
아니면 페이로드에 추가 속성을 추가하고 싶을 수도 있습니다.
<?php
namespace App Queue Jobs ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue Jobs RabbitMQJob as BaseJob ;
class RabbitMQJob extends BaseJob
{
/**
* Get the decoded body of the job.
*
* @return array
*/
public function payload ()
{
return [
' job ' => ' WhatheverFullyQualifiedClassNameToExecute@handle ' ,
' data ' => json_decode ( $ this -> getRawBody (), true )
];
}
}
JSON 형식이 아니거나 JSON의 'job' 키 없이 원시 메시지를 처리하려면 getName
메소드에 대한 스텁을 추가해야 합니다.
<?php
namespace App Queue Jobs ;
use Illuminate Support Facades Log ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue Jobs RabbitMQJob as BaseJob ;
class RabbitMQJob extends BaseJob
{
public function fire ()
{
$ anyMessage = $ this -> getRawBody ();
Log:: info ( $ anyMessage );
$ this -> delete ();
}
public function getName ()
{
return '' ;
}
}
내장된 PhpAmqpLibConnectionAMQPStreamConnection::class
또는 PhpAmqpLibConnectionAMQPSLLConnection::class
확장할 수 있으며 연결 구성 내에서 고유한 클래스를 정의할 수 있습니다. 구성에서 고유한 클래스 이름으로 connection
키를 지정하면 모든 연결에서 고유한 클래스를 사용합니다.
구성의 예:
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' connection ' = > App Queue Connection MyRabbitMQConnection::class,
],
// ...
],
자체 RabbitMQQueue::class
사용하려면 VladimirYuldashevLaravelQueueRabbitMQQueueRabbitMQQueue
확장하면 됩니다. RABBITMQ_WORKER
AppQueueRabbitMQQueue::class
로 설정하여 laravel에 클래스를 사용하도록 알립니다.
참고: 작업자 클래스는
VladimirYuldashevLaravelQueueRabbitMQQueueRabbitMQQueue
확장 해야 합니다 .
' connections ' => [
// ...
' rabbitmq ' => [
// ...
/* Set to a class if you wish to use your own. */
' worker ' => App Queue RabbitMQQueue::class,
],
// ...
],
<?php
namespace App Queue ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue RabbitMQQueue as BaseRabbitMQQueue ;
class RabbitMQQueue extends BaseRabbitMQQueue
{
// ...
}
예: 재연결 구현.
RabbitMQ에 다시 연결하려는 경우 연결이 끊어진 경우. 게시 및 createChannel 메서드를 재정의할 수 있습니다.
참고: 이는 모범 사례가 아니라 예시입니다.
<?php
namespace App Queue ;
use PhpAmqpLib Exception AMQPChannelClosedException ;
use PhpAmqpLib Exception AMQPConnectionClosedException ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue RabbitMQQueue as BaseRabbitMQQueue ;
class RabbitMQQueue extends BaseRabbitMQQueue
{
protected function publishBasic ( $ msg , $ exchange = '' , $ destination = '' , $ mandatory = false , $ immediate = false , $ ticket = null ): void
{
try {
parent :: publishBasic ( $ msg , $ exchange , $ destination , $ mandatory , $ immediate , $ ticket );
} catch ( AMQPConnectionClosedException | AMQPChannelClosedException ) {
$ this -> reconnect ();
parent :: publishBasic ( $ msg , $ exchange , $ destination , $ mandatory , $ immediate , $ ticket );
}
}
protected function publishBatch ( $ jobs , $ data = '' , $ queue = null ): void
{
try {
parent :: publishBatch ( $ jobs , $ data , $ queue );
} catch ( AMQPConnectionClosedException | AMQPChannelClosedException ) {
$ this -> reconnect ();
parent :: publishBatch ( $ jobs , $ data , $ queue );
}
}
protected function createChannel (): AMQPChannel
{
try {
return parent :: createChannel ();
} catch ( AMQPConnectionClosedException ) {
$ this -> reconnect ();
return parent :: createChannel ();
}
}
}
laravel에서 대기열을 제공하지 않으면 연결은 'default' 값의 기본 대기열을 사용합니다. 연결 구성에 추가 매개변수를 추가하여 기본 대기열을 변경할 수 있습니다.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' queue ' => env ( ' RABBITMQ_QUEUE ' , ' default ' ),
],
// ...
],
기본적으로 연결은 하트비트 설정 0
으로 생성됩니다. 구성을 변경하여 하트비트 설정을 변경할 수 있습니다.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
// ...
' heartbeat ' => 10 ,
],
],
// ...
],
RabbitMQ 서버에 대한 보안 연결이 필요한 경우 이러한 추가 구성 옵션을 추가해야 합니다.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' secure ' = > true ,
' options ' => [
// ...
' ssl_options ' => [
' cafile ' => env ( ' RABBITMQ_SSL_CAFILE ' , null ),
' local_cert ' => env ( ' RABBITMQ_SSL_LOCALCERT ' , null ),
' local_key ' => env ( ' RABBITMQ_SSL_LOCALKEY ' , null ),
' verify_peer ' => env ( ' RABBITMQ_SSL_VERIFY_PEER ' , true ),
' passphrase ' => env ( ' RABBITMQ_SSL_PASSPHRASE ' , null ),
],
],
],
// ...
],
모든 데이터베이스 커밋이 완료된 후 Laravel 작업자에게 이벤트를 전달하도록 지시합니다.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' after_commit ' => true ,
],
// ...
],
기본적으로 연결은 지연 연결로 생성됩니다. 어떤 이유로 연결 지연을 원하지 않는 경우 다음 구성을 설정하여 연결을 끌 수 있습니다.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' lazy ' = > false ,
],
// ...
],
기본적으로 연결에 사용되는 네트워크 프로토콜은 tcp입니다. 어떤 이유로 다른 네트워크 프로토콜을 사용하려는 경우 구성 옵션에 추가 값을 추가할 수 있습니다. 사용 가능한 프로토콜: tcp
, ssl
, tls
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' network_protocol ' => ' tcp ' ,
],
// ...
],
13.3.0부터 이 패키지는 Laravel Octane을 즉시 지원합니다. 먼저 Octane을 설치하고 octane 구성에서 'rabbitmq' 연결을 준비하는 것을 잊지 마십시오.
참조: #460(댓글)
구성을 완료하면 Laravel Queue API를 사용할 수 있습니다. 다른 대기열 드라이버를 사용한 경우 다른 항목을 변경할 필요가 없습니다. Queue API 사용법을 모르신다면 공식 Laravel 문서(http://laravel.com/docs/queues)를 참고하세요.
Lumen을 사용하려면 서비스 제공자를 bootstrap/app.php
에서 다음과 같이 수동으로 등록해야 합니다.
$ app -> register ( VladimirYuldashev LaravelQueueRabbitMQ LaravelQueueRabbitMQServiceProvider::class);
메시지를 소비하는 방법에는 두 가지가 있습니다.
Laravel의 내장 명령인 queue:work
명령입니다. 이 명령은 basic_get
활용합니다. 여러 대기열을 사용하려면 이 방법을 사용하세요.
이 패키지에서 제공하는 rabbitmq:consume
명령입니다. 이 명령은 basic_consume
활용하고 basic_get
보다 성능이 ~2배 더 높지만 다중 대기열을 지원하지 않습니다.
docker-compose
사용하여 RabbitMQ를 설정합니다.
docker compose up -d
테스트 스위트를 실행하려면 다음 명령을 사용할 수 있습니다.
# To run both style and unit tests.
composer test
# To run only style tests.
composer test:style
# To run only unit tests.
composer test:unit
스타일 테스트에서 오류가 발생하면 다음 명령을 사용하여 모든 문제는 아니더라도 대부분의 문제를 자동으로 수정할 수 있습니다.
composer fix:style
버그를 발견하고 문제를 열어 이 패키지에 기여할 수 있습니다. 끌어오기 요청이나 문제를 생성하는 패키지 버전을 추가하세요. (예: [5.2] 지연된 작업의 치명적인 오류)