最新バージョンのみに新機能が追加されます。バグ修正は次のスキームを使用して提供されます。
パッケージバージョン | Laravelのバージョン | バグ修正まで | |
---|---|---|---|
13 | 9 | 2023 年 8 月 8 日 | ドキュメント |
次のコマンドを使用して、composer 経由でこのパッケージをインストールできます。
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では失敗したジョブはデータベースに保存されます。ただし、他のプロセスにもメッセージに対して何かを行うように指示したい場合があります。失敗したメッセージを Exchange または特定のキューに再ルーティングするように 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 をサポートしていますが、構成では、Horizon と互換性のある QueueApi を使用するように Laravel に通知する必要があります。
' 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 に再接続する場合。 Publishing メソッドと 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);
メッセージを消費するには 2 つの方法があります。
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] 遅延ジョブの致命的エラー)