Sólo la última versión obtendrá nuevas funciones. Las correcciones de errores se proporcionarán utilizando el siguiente esquema:
Versión del paquete | Versión Laravel | Corrección de errores hasta | |
---|---|---|---|
13 | 9 | 8 de agosto de 2023 | Documentación |
Puede instalar este paquete a través del compositor usando este comando:
composer require vladimir-yuldashev/laravel-queue-rabbitmq
El paquete se registrará automáticamente.
Agregue conexión a config/queue.php
:
Esta es la configuración mínima para que funcione la conexión/controlador 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 ' , ' / ' ),
],
// ...
],
// ...
],
// ...
],
Opcionalmente, agregue opciones de cola a la configuración de una conexión. Cada cola creada para esta conexión obtiene las propiedades.
Cuando desee priorizar los mensajes que se retrasaron, puede hacerlo agregando opciones adicionales.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' prioritize_delayed ' => false ,
' queue_max_priority ' => 10 ,
],
],
],
// ...
],
Cuando desee publicar mensajes en un intercambio con claves de enrutamiento, esto es posible agregando opciones adicionales.
amq.direct
para la clave de enrutamiento.queue
.%s
en la clave de enrutamiento, se sustituirá el nombre_cola.Nota: cuando utilice un intercambio con clave de enrutamiento, probablemente usted mismo cree sus colas con enlaces.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' exchange ' => ' application-x ' ,
' exchange_type ' => ' topic ' ,
' exchange_routing_key ' => '' ,
],
],
],
// ...
],
En Laravel, los trabajos fallidos se almacenan en la base de datos. Pero tal vez desee indicarle a algún otro proceso que también haga algo con el mensaje. Cuando desee indicarle a RabbitMQ que redirija los mensajes fallidos a un intercambio o una cola específica, esto es posible agregando opciones adicionales.
amq.direct
para la clave de enrutamiento.queue
se sustituye por '.failed'
.%s
en la clave de enrutamiento, se sustituirá el nombre_cola.Nota: Al utilizar el intercambio de trabajos fallidos con la clave de enrutamiento, probablemente necesite crear su intercambio/cola con enlaces usted mismo.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' reroute_failed ' => true ,
' failed_exchange ' => ' failed-exchange ' ,
' failed_routing_key ' => ' application-x.%s ' ,
],
],
],
// ...
],
A partir de 8.0, este paquete es compatible con Laravel Horizon desde el primer momento. En primer lugar, instale Horizon y luego configure RABBITMQ_WORKER
en horizon
.
El horizonte depende de los eventos enviados por el trabajador. Estos eventos informan a Horizon qué se hizo con el mensaje/trabajo.
Esta biblioteca es compatible con Horizon, pero en la configuración debe informar a Laravel que use QueueApi compatible con Horizon.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
/* Set to "horizon" if you wish to use Laravel Horizon. */
' worker ' => env ( ' RABBITMQ_WORKER ' , ' default ' ),
],
// ...
],
A veces hay que trabajar con mensajes publicados por otra aplicación.
Esos mensajes probablemente no respetarán el esquema de carga útil del trabajo de Laravel. El problema con estos mensajes es que los trabajadores de Laravel no podrán determinar el trabajo o clase real a ejecutar.
Puede ampliar la clase RabbitMQJob::class
integrada y dentro de la configuración de conexión de la cola, puede definir su propia clase. Cuando especifica una clave job
en la configuración, con su propio nombre de clase, cada mensaje recuperado del intermediario será empaquetado por su propia clase.
Un ejemplo para la configuración:
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' job ' => App Queue Jobs RabbitMQJob::class,
],
],
],
// ...
],
Un ejemplo de su propia clase de trabajo:
<?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 ();
}
}
O tal vez quieras agregar propiedades adicionales a la carga útil:
<?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 desea manejar mensajes sin formato, no en formato JSON o sin clave de 'trabajo' en JSON, debe agregar un código auxiliar para el método 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 '' ;
}
}
Puede ampliar la clase integrada PhpAmqpLibConnectionAMQPStreamConnection::class
o PhpAmqpLibConnectionAMQPSLLConnection::class
y dentro de la configuración de conexión, puede definir su propia clase. Cuando especifica una clave connection
en la configuración, con su propio nombre de clase, cada conexión utilizará su propia clase.
Un ejemplo para la configuración:
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' connection ' = > App Queue Connection MyRabbitMQConnection::class,
],
// ...
],
Si desea utilizar su propia RabbitMQQueue::class
esto es posible extendiendo VladimirYuldashevLaravelQueueRabbitMQQueueRabbitMQQueue
. e informe a laravel que use su clase configurando RABBITMQ_WORKER
en AppQueueRabbitMQQueue::class
.
Nota: Las clases de trabajadores deben extender
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
{
// ...
}
Por ejemplo: una implementación de reconexión.
Si desea volver a conectarse a RabbitMQ, si la conexión está muerta. Puede anular los métodos de publicación y createChannel.
Nota: esta no es una buena práctica, es un ejemplo.
<?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 conexión utiliza una cola predeterminada con el valor 'predeterminado', cuando laravel no proporciona ninguna cola. Es posible cambiar la cola predeterminada agregando un parámetro adicional en la configuración de la conexión.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' queue ' => env ( ' RABBITMQ_QUEUE ' , ' default ' ),
],
// ...
],
De forma predeterminada, su conexión se creará con una configuración de latido de 0
. Puede modificar la configuración de los latidos cambiando la configuración.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
// ...
' heartbeat ' => 10 ,
],
],
// ...
],
Si necesita una conexión segura a los servidores RabbitMQ, deberá agregar estas opciones de configuración adicionales.
' 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 ),
],
],
],
// ...
],
Para indicar a los trabajadores de Laravel que envíen eventos después de que se completen todas las confirmaciones de la base de datos.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' after_commit ' => true ,
],
// ...
],
De forma predeterminada, su conexión se creará como una conexión diferida. Si por alguna razón no desea que la conexión sea lenta, puede desactivarla configurando la siguiente configuración.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' lazy ' = > false ,
],
// ...
],
De forma predeterminada, el protocolo de red utilizado para la conexión es tcp. Si por alguna razón desea utilizar otro protocolo de red, puede agregar el valor adicional en sus opciones de configuración. Protocolos disponibles: tcp
, ssl
, tls
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' network_protocol ' => ' tcp ' ,
],
// ...
],
A partir de 13.3.0, este paquete admite Laravel Octane desde el primer momento. En primer lugar, instale Octane y no olvide activar la conexión 'rabbitmq' en la configuración de octane.
Ver: #460 (comentario)
Una vez que haya completado la configuración, podrá utilizar la API de Laravel Queue. Si utilizó otros controladores de cola, no necesita cambiar nada más. Si no sabe cómo utilizar la API de cola, consulte la documentación oficial de Laravel: http://laravel.com/docs/queues
Para utilizar Lumen, el proveedor de servicios debe registrarse manualmente de la siguiente manera en bootstrap/app.php
:
$ app -> register ( VladimirYuldashev LaravelQueueRabbitMQ LaravelQueueRabbitMQServiceProvider::class);
Hay dos formas de consumir mensajes.
queue:work
comando que es el comando integrado de Laravel. Este comando utiliza basic_get
. Úselo si desea consumir varias colas.
rabbitmq:consume
comando proporcionado por este paquete. Este comando utiliza basic_consume
y tiene un rendimiento mayor que basic_get
en aproximadamente 2 veces, pero no admite varias colas.
Configure RabbitMQ usando docker-compose
:
docker compose up -d
Para ejecutar el conjunto de pruebas, puede utilizar los siguientes comandos:
# 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 recibe algún error de las pruebas de estilo, puede solucionar automáticamente la mayoría, si no todos, los problemas con el siguiente comando:
composer fix:style
Puede contribuir a este paquete descubriendo errores y abriendo problemas. Por favor, agregue a qué versión del paquete crea la solicitud de extracción o el problema. (por ejemplo, [5.2] Error fatal en un trabajo retrasado)