NOTAS WEB
¿Qué es Symfony Messenger?

Introducción a Symfony Messenger
Symfony Messenger es un componente diseñado para gestionar mensajes (comandos, eventos, tareas) de forma sincrónica o asíncrona mediante buses de mensajes. Su flexibilidad permite integrar transportes como AMQP (RabbitMQ), Doctrine (base de datos) o Redis, lo que lo convierte en una herramienta clave para aplicaciones escalables.
Algunos conceptos claves que hay que saber en el flujo de trabajo de Symfony Messenger.
Conceptos clave:
Concepto | ¿Qué es? |
---|---|
Message | Un objeto que representa una tarea a ejecutar. |
Handler | Clase que contiene el código para procesar ese mensaje. |
Bus | Canal que enruta mensajes hacia sus handlers (command bus , etc.). |
Transport | Medio por el que se entregan los mensajes. Puede ser inmediato (sync) o encolado (async). |
Worker | Proceso que lee mensajes de una cola y los ejecuta. |
retry_strategy | Configura cómo se reintentan mensajes en caso de fallo. |
La Tabla messenger_messages
Cuando se usa Doctrine Transport, esta tabla almacena mensajes pendientes o fallidos. Campos relevantes:
Campo | Descripción |
---|---|
id | Identificador único del mensaje. |
body | Contenido del mensaje serializado (generalmente en JSON). |
headers | Metadatos (clase del mensaje, intentos, etc.). |
queue_name | Nombre del transporte/cola asociada (ej: async , failed ). |
delivered_at | Fecha en que un worker tomó el mensaje (si no es NULL , ya fue procesado). |
available_at | Cuándo estará disponible para ser procesado (útil para mensajes retrasados). |
created_at | Fecha de creación del mensaje. |
Procesamiento Asíncrono: Flujo Paso a Paso
- Envío del Mensaje: $messageBus->dispatch(new UpdateExternalServiceCommand($data));
- Serialización y Almacenamiento
Symfony serializa el mensaje y lo guarda enmessenger_messages
(si el transporte es Doctrine). - Ejecución por el Worker bin/console messenger:consume async
- Manejo de Errores
- Si el handler lanza una excepción, se aplica la
retry_strategy
. - Tras agotar los reintentos, el mensaje se mueve al Failure Transport (si está configurado).
- Si el handler lanza una excepción, se aplica la
Configuración de Reintentos Robustos
Ejemplo con retry exponencial y rate limiting:
# config/packages/messenger.yaml
framework:
messenger:
transports:
async:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
retry_strategy:
max_retries: 3
delay: 2000 # 2 segundos iniciales
multiplier: 2 # Delay exponencial: 2s → 4s → 8s
failure_transport: failed
# config/packages/rate_limiter.yaml
rate_limiter:
api_limiter:
policy: 'fixed_window'
limit: 5
interval: 1 # 5 llamadas por segundo
En el handler:
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler]
class UpdateExternalServiceHandler
{
public function __invoke(UpdateExternalServiceCommand $command)
{
$limiter = $this->rateLimiterFactory->create('api_limiter');
if (!$limiter->consume()->isAccepted()) {
throw new \RuntimeException('Límite de tasa excedido');
}
// Lógica para llamar al servicio externo
}
}
Manejo de Mensajes Fallidos: Failure Transport
Configuración recomendada para entornos productivos:
- Definir el transporte de fallos framework: messenger: failure_transport: failed transports: failed: dsn: ‘doctrine://default?queue_name=failed’
- Crear tablas necesarias bin/console doctrine:migrations:migrate php bin/console messenger:setup-transports
Comandos Útiles
- Listar mensajes fallidos: bin/console messenger:failed:show
- Reintentar mensajes: bin/console messenger:failed:retry
- Eliminar mensajes fallidos: bin/console messenger:failed:remove
¿Por Qué Usar el Failure Transport?
- Auditoría: Conserva un registro de errores para análisis.
- Recuperación: Permite reintentos manuales sin manipular la base de datos.
- Seguridad: Evita pérdida de mensajes críticos.
Fuentes y Documentación Oficial
- Symfony Messenger: Procesamiento Asíncrono
- Configuración de Reintentos
- Manejo de Mensajes Fallidos
- Rate Limiter en Symfony
Symfony Messenger simplifica el manejo de tareas asíncronas y errores, pero requiere una configuración cuidadosa para garantizar robustez. Usando estrategias de reintento, rate limiting y el failure transport, puedes construir sistemas resilientes que se adapten a restricciones externas como límites de API.

Desarrollador de software con más de 7 años de experiencia, especializado en desarrollo web y backend. Con habilidades demostradas en PHP, Laravel, Symfony, y una amplia gama de tecnologías modernas. Apasionado por el diseño y desarrollo de software.