RabbitMQ

Integración RabbitMQ en Laravel.

Posted by     "Xavi Rodríguez." on Friday, December 10, 2021

Este paquete lo desarrolle para un proyecto de un cliente que requería realizar diversas tareas asíncronas , pero también aquellas que requería respuesta por parte del consumidor de la cola, para ello explotamos la propiedad RPC que dispone RabbitMQ. enter image description here La lógica es sencilla el cliente realiza una petición y se adjunta a la cabecera una propiedad denominada correlation_id, el cliente espera a recibir de vuelta el mensaje con el correlation_id enviado también adjuntado a la cabecera del mensaje. Por ejemplo imaginemos que queremos recibir el número de factura desde otro servicio lo podríamos realizar de la siguiente manera:

$this->result = $this->rabbitMQ->requestRpc(
$id,
"billing",
"billing_return",
"command.billing",
"billing.1.query.income.getNextIncomeInvoiceNumber",
json_encode($json)
);

El cliente que debe emitir la respuesta, quedaría de la siguiente manera,.

public  function  handle(IncomeGotNextInvoiceNumberEvent  $incomeGotNextInvoiceNumberEvent)
{
$incomeNextInvoiceNumber = json_encode($incomeGotNextInvoiceNumberEvent->incomeNextInvoiceNumber());
$msg = $incomeGotNextInvoiceNumberEvent->message();
$this->rabbitMQ->responseRpc($incomeGotNextInvoiceNumberEvent->incomeNextInvoiceNumber(), $msg);
}

El correlation_id va encapsulado dentro del $msg, por tanto el cliente que solicita se queda a la espera de recibir un mensaje con ese correlation_id, en la cola y el exchange correspondiente.

Podeís encontrar el paquete en el siguiente enlace de github El proyecto también está subido en packagist para su uso con más de 1000 descargas. Y aquí os dejo un vídeo de explicación de como funciona internamente. Y en este otro repo de github el código utilizado en el ejemplo del vídeo. Lo cierto es que lo tengo abandonado pero quiero retomarlo y os animo a que me ayudéis a mejorarlo y ampliar funcionalidades, con las últimas mejoras incluidas por RabbitMQ, como puede ser los streams.

Nos vemos en un próximo post.