AMQP

Protocolos Y Transporte Security Notes Jan 6, 2025 PYTHON

Definición

Imagina que tienes un restaurante muy ocupado donde los pedidos de cocina llegan más rápido de lo que los cocineros pueden prepararlos. ¿La solución? Una barra de pedidos donde los tickets esperan ordenadamente hasta que un cocinero esté libre. Nadie pierde pedidos, nadie se estresa, y cada ticket se procesa en orden. AMQP (Advanced Message Queuing Protocol) hace exactamente esto para sistemas de software.

AMQP es un protocolo estándar para mensajería asíncrona entre sistemas. En lugar de que el Sistema A llame directamente al Sistema B y espere (lo cual falla si B está ocupado o caído), A deposita un mensaje en una cola. B lo recoge cuando pueda. Si B está caído, el mensaje espera pacientemente. Si hay mil mensajes, se procesan uno por uno sin perder ninguno. Es como tener un intermediario confiable que nunca olvida ni pierde mensajes.

¿Cuándo necesitas AMQP? Cuando tienes sistemas que se comunican a diferentes velocidades, cuando no puedes permitirte perder mensajes, o cuando quieres desacoplar servicios para que uno pueda fallar sin tumbar a los demás. E-commerce procesando pedidos, bancos manejando transacciones, sistemas de notificaciones enviando millones de emails - todos se benefician de esta mensajería robusta.

Ejemplo

Procesamiento de Pedidos E-commerce: Cuando haces un pedido en Amazon, no esperas a que se procese inventario, pago, logística y notificación todo sincronizado. El pedido se pone en una cola. Un servicio verifica inventario, otro procesa pago, otro notifica al almacén. Cada uno toma mensajes de colas a su propio ritmo. Si el servicio de email está lento, los demás siguen funcionando.

Sistema de Notificaciones: Cuando 50,000 usuarios necesitan un email de actualización, no llamas a SendGrid 50,000 veces secuencialmente. Pones 50,000 mensajes en una cola. Múltiples “workers” van tomando mensajes y enviando emails. Si uno falla, otro toma el relevo. Los mensajes que fallan van a una cola de “reintentos” para procesarse después.

Procesamiento de Videos: YouTube no procesa tu video subido inmediatamente mientras esperas. Tu video va a una cola. Cuando hay capacidad de procesamiento disponible, se toma de la cola, se transcodifica a múltiples resoluciones, se generan miniaturas. Tú recibes una notificación cuando termina - podrían ser segundos o minutos dependiendo de la carga.

Transacciones Bancarias: Un banco procesa miles de transacciones por segundo. Cada transacción va a una cola que garantiza procesamiento exactamente una vez, en orden. Si el sistema de contabilidad está lento, las transacciones esperan en cola pero nunca se pierden ni se duplican. La integridad financiera depende de esta garantía.

Analogía

La Oficina de Correos con Clasificación: AMQP es como un sistema postal sofisticado. Envías una carta (mensaje) a la oficina de correos (exchange). La oficina la clasifica según la dirección (routing key) y la pone en el buzón correcto (cola). El destinatario (consumidor) la recoge cuando puede. Si el destinatario está de vacaciones, la carta espera segura en el buzón.

La Cocina del Restaurante: Los pedidos (mensajes) se escriben en tickets y van a una barra de pedidos (cola). Los cocineros (consumers) toman tickets cuando están listos. Si hay un cocinero enfermo, los demás siguen trabajando. Los tickets no se pierden aunque la cocina esté saturada - simplemente esperan su turno.

El Sistema de Equipaje del Aeropuerto: Las maletas (mensajes) van a una cinta transportadora (cola) que las lleva a diferentes áreas según las etiquetas (routing keys). Handlers (consumers) las recogen y las cargan en los aviones correctos. El sistema maneja miles de maletas sin perder ninguna, incluso cuando los vuelos se retrasan.

La Línea de Ensamblaje: En una fábrica, las piezas (mensajes) pasan por una cinta transportadora (cola) donde diferentes estaciones (consumers) realizan operaciones. Si una estación está ocupada, las piezas esperan. Si una estación falla, las piezas se acumulan hasta que se repare. Ninguna pieza se pierde ni se salta pasos.

Diagrama

flowchart LR
    subgraph Productores
        P1[Servicio Pedidos]
        P2[Servicio Usuarios]
    end

    subgraph Tipos de Exchange
        E1[Exchange Directo
Enruta por clave exacta] E2[Exchange Fanout
Broadcast a todos] E3[Exchange Topic
Enruta por patrón] end subgraph Colas Q1[pedidos.nuevos] Q2[pedidos.enviar] Q3[notificaciones] Q4[analytics] end subgraph Consumidores C1[Procesador Pedidos] C2[Servicio Envíos] C3[Servicio Email] C4[Servicio Analytics] end P1 -->|routing_key: pedido.nuevo| E1 P1 -->|routing_key: pedido.enviar| E1 P2 -->|broadcast| E2 P1 -->|routing_key: pedido.*| E3 E1 -->|binding: pedido.nuevo| Q1 E1 -->|binding: pedido.enviar| Q2 E2 --> Q3 E2 --> Q4 E3 -->|binding: pedido.#| Q4 Q1 --> C1 Q2 --> C2 Q3 --> C3 Q4 --> C4

Code Example


# Ejemplo Python usando librería pika
import pika

# Conexión al broker
connection = pika.BlockingConnection(
    pika.ConnectionParameters('localhost')
)
channel = connection.channel()

# Declarar cola (la crea si no existe)
channel.queue_declare(queue='pedidos', durable=True)

# Publicar mensaje
channel.basic_publish(
    exchange='',
    routing_key='pedidos',
    body='{"event": "pedido.creado", "pedidoId": 12345}',
    properties=pika.BasicProperties(
        delivery_mode=2,  # Mensaje persistente
    )
)
print("Mensaje enviado a la cola")
connection.close()

# Consumidor (en otro proceso/servidor)
def procesar_pedido(ch, method, properties, body):
    print(f"Procesando: {body}")
    # ... lógica de procesamiento
    ch.basic_ack(delivery_tag=method.delivery_tag)

channel.basic_consume(
    queue='pedidos',
    on_message_callback=procesar_pedido
)
channel.start_consuming()

Notas de Seguridad

SECURITY NOTES

Requisitos Principales:

  • Usa siempre TLS/SSL para conexiones AMQP en producción.
  • Implementa autenticación con usuario/contraseña o certificados.
  • Usa hosts virtuales (vhosts) para aislamiento de tenants.
  • Aplica permisos de cola y controles de acceso.

Mejores Prácticas:

  • Monitorea ataques de inyección de mensajes.
  • Valida el contenido de los mensajes antes de procesarlos.
  • Implementa dead letter queues para mensajes fallidos.
  • No expongas credenciales de conexión en logs o código fuente..

Standards & RFCs