Saltar al contenido principal

RabbitMQ

CryoNova Labs utiliza RabbitMQ como broker de mensajería para la comunicación asíncrona entre microservicios. Esta infraestructura de mensajería es fundamental para garantizar la fiabilidad, escalabilidad y desacoplamiento de nuestros sistemas.

Arquitectura

Utilizamos RabbitMQ 3.13 en una configuración de clúster con 3 nodos para alta disponibilidad. La arquitectura general es la siguiente:

Patrones de mensajería

Implementamos varios patrones de mensajería para diferentes casos de uso:

Publicación/Suscripción

Utilizado para eventos de dominio donde múltiples servicios necesitan reaccionar al mismo evento.

Enrutamiento por tema

Utilizado para filtrar mensajes según patrones específicos.

Cola de trabajo

Utilizado para distribuir tareas entre múltiples trabajadores.

Configuración

Configuración de alta disponibilidad

Nuestro clúster RabbitMQ está configurado con las siguientes características:

  • Mirroring de colas: Todas las colas se replican en al menos 2 nodos
  • Lazy queues: Para mensajes de gran tamaño o volumen
  • Quorum queues: Para mensajes críticos que requieren consistencia
# Ejemplo de configuración para un nodo
[
{rabbit, [
{tcp_listeners, [5672]},
{hipe_compile, false},
{vm_memory_high_watermark, 0.6},
{vm_memory_high_watermark_paging_ratio, 0.8},
{disk_free_limit, "1GB"}
]},
{rabbitmq_management, [
{listener, [{port, 15672}]}
]},
{rabbitmq_prometheus, [
{tcp_config, [{port, 15692}]}
]}
].

Políticas de colas

Aplicamos diferentes políticas según el tipo de cola:

# Colas de eventos de dominio (con replicación)
rabbitmqctl set_policy ha-domain-events "^domain-events\." \
'{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}' \
--priority 1 --apply-to queues

# Colas de comandos (con TTL)
rabbitmqctl set_policy ttl-commands "^commands\." \
'{"message-ttl":3600000}' \
--priority 1 --apply-to queues

Gestión de errores

Dead Letter Exchange

Configuramos un Dead Letter Exchange (DLX) para capturar mensajes que no pueden ser procesados:

// Configuración de cola con DLX
var args = new Dictionary<string, object>
{
{"x-dead-letter-exchange", "dlx"},
{"x-dead-letter-routing-key", "failed-messages"}
};

channel.QueueDeclare(
queue: "my-queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: args);

Reintentos con backoff exponencial

Implementamos una estrategia de reintentos con backoff exponencial para manejar fallos transitorios:

// Política de reintentos
var retryPolicy = Policy
.Handle<Exception>()
.WaitAndRetry(
retryCount: 5,
sleepDurationProvider: attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt)),
onRetry: (exception, timeSpan, retryCount, context) =>
{
_logger.LogWarning($"Reintento {retryCount} después de {timeSpan.TotalSeconds}s por {exception.Message}");
});

// Uso de la política
retryPolicy.Execute(() =>
{
// Código para procesar el mensaje
});

Monitorización

Utilizamos varias herramientas para monitorizar nuestro clúster RabbitMQ:

  • Prometheus + Grafana: Métricas de rendimiento y alertas
  • RabbitMQ Management Plugin: Interfaz de usuario para administración
  • Logs centralizados: Agregación de logs en Elasticsearch

Métricas clave

MétricaDescripciónUmbral de alerta
rabbitmq_queue_messagesNúmero de mensajes en cola>10000
rabbitmq_queue_messages_unacknowledgedMensajes sin confirmar>1000
rabbitmq_node_mem_usedUso de memoria>80%
rabbitmq_channel_consumersNúmero de consumidoresmenos de 1 por cola

Consideraciones de seguridad

  • TLS para todas las conexiones: Comunicación cifrada
  • Autenticación con certificados: Para conexiones entre servicios internos
  • VHOST separados: Aislamiento por entorno (dev, staging, prod)
  • Permisos granulares: Cada servicio tiene solo los permisos necesarios

Buenas prácticas

  1. Mensajes idempotentes: Diseñar los consumidores para manejar mensajes duplicados
  2. Confirmaciones explícitas: Usar ack solo después de procesar completamente un mensaje
  3. Prefetch count adecuado: Limitar el número de mensajes que un consumidor recibe a la vez
  4. Persistencia selectiva: Marcar como persistentes solo los mensajes críticos
  5. Monitorización proactiva: Alertas tempranas para colas que crecen anormalmente