Symfony Messenger es una herramienta muy útil para gestionar tareas asíncronas dentro de una aplicación web. Permite enviar mensajes a un sistema de colas y procesarlos en segundo plano, sin bloquear el flujo principal de la aplicación. En este artículo, vamos a ver cómo utilizar Symfony Messenger para crear un sistema de mensajería asíncrona en una aplicación web.
¿Qué es Symfony Messenger?
Symfony Messenger es un componente de Symfony que nos permite enviar y procesar mensajes de forma asíncrona. Los mensajes pueden ser de diferentes tipos: eventos, comandos, consultas, notificaciones, etc. El proceso de envío y procesamiento de los mensajes se realiza a través de un sistema de colas, que puede ser gestionado por diferentes proveedores, como RabbitMQ, Redis, Amazon SQS, etc.
El objetivo principal de Symfony Messenger es separar la lógica del negocio de la gestión de tareas asíncronas. De esta forma, podemos enviar un mensaje a una cola y seguir ejecutando el flujo principal de la aplicación, sin esperar a que la tarea sea completada.
¿Por qué utilizar Symfony Messenger?
Symfony Messenger es una herramienta muy útil para tareas que pueden tardar mucho tiempo en ser completadas, o para tareas que no necesitan ser completadas inmediatamente. Algunos ejemplos de uso de Symfony Messenger son:
Cómo utilizar Symfony Messenger
Para utilizar Symfony Messenger, primero debemos instalar el componente a través de Composer:
composer require symfony/messenger
Una vez instalado, podemos configurar el componente en el archivo config/packages/messenger.yaml. Aquí es donde especificamos el proveedor de la cola que vamos a utilizar, así como las rutas de los controladores que se encargarán de procesar los mensajes:
framework:
messenger:
transports:
async: '%env(MESSENGER_TRANSPORT_DSN)%'
routing:
'App\Message\NotificationMessage': async
default_serializer: messenger.transport.symfony_serializer
En este ejemplo, estamos utilizando el proveedor async, que se define en la variable de entorno MESSENGER_TRANSPORT_DSN. Además, estamos indicando que el mensaje NotificationMessage será procesado por el controlador asociado al transporte async.
A continuación, creamos la clase NotificationMessage que será enviada a la cola. Esta clase puede tener los atributos que necesitemos para procesar la tarea, como el destinatario del correo electrónico, el contenido del mensaje, etc.
namespace App\Message;
class NotificationMessage
{
private $recipient;
private $subject;
private $body;
public function __construct(string $recipient, string $subject, string $body)
{
$this->recipient = $recipient;
$this->subject = $subject;
$this->body = $body;
}
public function getRecipient(): string
{
return $this->recipient;
}
public function getSubject(): string
{
return $this->subject;
}
public function getBody(): string
{
return $this->body;
}
}
Una vez creada la clase NotificationMessage, podemos enviarla a la cola utilizando el servicio MessageBusInterface. Este servicio se encarga de enviar el mensaje al proveedor de la cola:
use Symfony\Component\Messenger\MessageBusInterface;
use App\Message\NotificationMessage;
class NotificationController extends AbstractController
{
public function sendNotification(MessageBusInterface $messageBus)
{
$message = new NotificationMessage('[email protected]', 'Nuevo mensaje', 'Hola, ¿cómo estás?');
$messageBus->dispatch($message);
// ...
}
}
En este ejemplo, estamos enviando un mensaje de tipo NotificationMessage al proveedor de la cola. La clase NotificationController se encarga de crear la instancia del mensaje y enviarla a través del servicio MessageBusInterface.
Por último, debemos crear el controlador que se encargará de procesar el mensaje. Este controlador debe implementar la interfaz MessageHandlerInterface y recibir como parámetro la instancia del mensaje:
namespace App\MessageHandler;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
use App\Message\NotificationMessage;
class NotificationHandler implements MessageHandlerInterface
{
public function __invoke(NotificationMessage $message)
{
// Procesar el mensaje...
}
}
En este ejemplo, estamos creando el controlador NotificationHandler que se encargará de procesar los mensajes de tipo NotificationMessage. La lógica de procesamiento se implementa en el método __invoke().
Symfony Messenger es una herramienta muy útil para crear sistemas de mensajería asíncrona en aplicaciones web. Permite enviar y procesar mensajes de forma asíncrona, lo que mejora la respuesta de la aplicación al usuario y evita bloqueos innecesarios. Con Symfony Messenger, podemos separar la lógica del negocio de la gestión de tareas asíncronas, lo que simplifica el código y mejora la escalabilidad de la aplicación.