Seule la dernière version bénéficiera de nouvelles fonctionnalités. Les corrections de bogues seront fournies selon le schéma suivant :
Version du paquet | Version Laravel | Corrections de bugs jusqu'à | |
---|---|---|---|
13 | 9 | 8 août 2023 | Documentation |
Vous pouvez installer ce package via composer en utilisant cette commande :
composer require vladimir-yuldashev/laravel-queue-rabbitmq
Le package s’enregistrera automatiquement.
Ajouter une connexion à config/queue.php
:
Il s'agit de la configuration minimale pour que la connexion/le pilote RabbitMQ fonctionne.
' 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 ' , ' / ' ),
],
// ...
],
// ...
],
// ...
],
Ajoutez éventuellement des options de file d'attente à la configuration d'une connexion. Chaque file d'attente créée pour cette connexion obtient les propriétés.
Lorsque vous souhaitez hiérarchiser les messages lorsqu'ils ont été retardés, cela est possible en ajoutant des options supplémentaires.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' prioritize_delayed ' => false ,
' queue_max_priority ' => 10 ,
],
],
],
// ...
],
Lorsque vous souhaitez publier des messages sur un échange avec des clés de routage, cela est possible en ajoutant des options supplémentaires.
amq.direct
pour la clé de routagequeue
.%s
dans la clé de routage, le nom de la file d'attente sera remplacé.Remarque : lorsque vous utilisez un échange avec une clé de routage, vous créez probablement vous-même vos files d'attente avec des liaisons.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' exchange ' => ' application-x ' ,
' exchange_type ' => ' topic ' ,
' exchange_routing_key ' => '' ,
],
],
],
// ...
],
Dans Laravel, les travaux ayant échoué sont stockés dans la base de données. Mais peut-être souhaitez-vous demander à un autre processus de faire également quelque chose avec le message. Lorsque vous souhaitez demander à RabbitMQ de rediriger les messages ayant échoué vers un échange ou une file d'attente spécifique, cela est possible en ajoutant des options supplémentaires.
amq.direct
pour la clé de routagequeue
est remplacé par '.failed'
.%s
dans la clé de routage, le nom_queue sera remplacé.Remarque : lorsque vous utilisez l'échange failed_job avec la clé de routage, vous devrez probablement créer vous-même votre échange/file d'attente avec des liaisons.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' reroute_failed ' => true ,
' failed_exchange ' => ' failed-exchange ' ,
' failed_routing_key ' => ' application-x.%s ' ,
],
],
],
// ...
],
À partir de la version 8.0, ce package prend en charge Laravel Horizon dès la sortie de la boîte. Tout d'abord, installez Horizon, puis définissez RABBITMQ_WORKER
sur horizon
.
Horizon dépend des événements envoyés par le travailleur. Ces événements informent Horizon de ce qui a été fait avec le message/la tâche.
Cette bibliothèque prend en charge Horizon, mais dans la configuration, vous devez informer Laravel d'utiliser le QueueApi compatible avec Horizon.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
/* Set to "horizon" if you wish to use Laravel Horizon. */
' worker ' => env ( ' RABBITMQ_WORKER ' , ' default ' ),
],
// ...
],
Parfois, vous devez travailler avec des messages publiés par une autre application.
Ces messages ne respecteront probablement pas le schéma de charge utile du travail de Laravel. Le problème avec ces messages est que les travailleurs de Laravel ne seront pas en mesure de déterminer le travail ou la classe à exécuter.
Vous pouvez étendre la classe RabbitMQJob::class
intégrée et dans la configuration de connexion à la file d'attente, vous pouvez définir votre propre classe. Lorsque vous spécifiez une clé job
dans la configuration, avec votre propre nom de classe, chaque message récupéré du courtier sera encapsulé par votre propre classe.
Un exemple pour la configuration :
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' job ' => App Queue Jobs RabbitMQJob::class,
],
],
],
// ...
],
Un exemple de votre propre catégorie d'emplois :
<?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 ();
}
}
Ou peut-être souhaitez-vous ajouter des propriétés supplémentaires à la charge utile :
<?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 )
];
}
}
Si vous souhaitez gérer un message brut, pas au format JSON ou sans clé 'job' en JSON, vous devez ajouter un stub pour la méthode 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 '' ;
}
}
Vous pouvez étendre la classe intégrée PhpAmqpLibConnectionAMQPStreamConnection::class
ou PhpAmqpLibConnectionAMQPSLLConnection::class
et dans la configuration de connexion, vous pouvez définir votre propre classe. Lorsque vous spécifiez une clé connection
dans la configuration, avec votre propre nom de classe, chaque connexion utilisera votre propre classe.
Un exemple pour la configuration :
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' connection ' = > App Queue Connection MyRabbitMQConnection::class,
],
// ...
],
Si vous souhaitez utiliser votre propre RabbitMQQueue::class
cela est possible en étendant VladimirYuldashevLaravelQueueRabbitMQQueueRabbitMQQueue
. et informez Laravel d'utiliser votre classe en définissant RABBITMQ_WORKER
sur AppQueueRabbitMQQueue::class
.
Remarque : Les classes de travailleurs doivent étendre
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
{
// ...
}
Par exemple : une implémentation de reconnexion.
Si vous souhaitez vous reconnecter à RabbitMQ, si la connexion est morte. Vous pouvez remplacer les méthodes de publication et createChannel.
Remarque : il ne s'agit pas d'une bonne pratique, c'est un exemple.
<?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 ();
}
}
}
La connexion utilise une file d'attente par défaut avec la valeur « par défaut », lorsqu'aucune file d'attente n'est fournie par Laravel. Il est possible de modifier la file d'attente par défaut en ajoutant un paramètre supplémentaire dans la configuration de la connexion.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' queue ' => env ( ' RABBITMQ_QUEUE ' , ' default ' ),
],
// ...
],
Par défaut, votre connexion sera créée avec un paramètre de pulsation de 0
. Vous pouvez modifier les paramètres de battement de coeur en modifiant la configuration.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
// ...
' heartbeat ' => 10 ,
],
],
// ...
],
Si vous avez besoin d'une connexion sécurisée au(x) serveur(s) RabbitMQ, vous devrez ajouter ces options de configuration supplémentaires.
' 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 ),
],
],
],
// ...
],
Pour demander aux travailleurs Laravel de distribuer des événements une fois que toutes les validations de base de données sont terminées.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' after_commit ' => true ,
],
// ...
],
Par défaut, votre connexion sera créée en tant que connexion paresseuse. Si, pour une raison quelconque, vous ne souhaitez pas que la connexion soit paresseuse, vous pouvez la désactiver en définissant la configuration suivante.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' lazy ' = > false ,
],
// ...
],
Par défaut, le protocole réseau utilisé pour la connexion est TCP. Si pour une raison quelconque vous souhaitez utiliser un autre protocole réseau, vous pouvez ajouter la valeur supplémentaire dans vos options de configuration. Protocoles disponibles : tcp
, ssl
, tls
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' network_protocol ' => ' tcp ' ,
],
// ...
],
À partir de la version 13.3.0, ce package prend en charge Laravel Octane dès la sortie de la boîte. Tout d'abord, installez Octane et n'oubliez pas de réchauffer la connexion 'rabbitmq' dans la configuration d'Octane.
Voir : #460 (commentaire)
Une fois la configuration terminée, vous pouvez utiliser l'API Laravel Queue. Si vous avez utilisé d'autres pilotes de file d'attente, vous n'avez rien d'autre à modifier. Si vous ne savez pas comment utiliser l'API Queue, veuillez vous référer à la documentation officielle de Laravel : http://laravel.com/docs/queues
Pour l'utilisation de Lumen, le fournisseur de services doit être enregistré manuellement comme suit dans bootstrap/app.php
:
$ app -> register ( VladimirYuldashev LaravelQueueRabbitMQ LaravelQueueRabbitMQServiceProvider::class);
Il existe deux manières de consommer des messages.
commande queue:work
qui est la commande intégrée de Laravel. Cette commande utilise basic_get
. Utilisez-le si vous souhaitez consommer plusieurs files d'attente.
rabbitmq:consume
commande fournie par ce package. Cette commande utilise basic_consume
et est plus performante que basic_get
d'environ 2x, mais ne prend pas en charge plusieurs files d'attente.
Configurez RabbitMQ à l'aide docker-compose
:
docker compose up -d
Pour exécuter la suite de tests, vous pouvez utiliser les commandes suivantes :
# 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
Si vous recevez des erreurs lors des tests de style, vous pouvez résoudre automatiquement la plupart, sinon la totalité, des problèmes avec la commande suivante :
composer fix:style
Vous pouvez contribuer à ce package en découvrant des bugs et en ouvrant des problèmes. Veuillez ajouter à quelle version du package vous créez une demande d'extraction ou un problème. (par exemple [5.2] Erreur fatale sur un travail retardé)