Registro / artículo
RabbitMQ, Kafka o SQS: cómo elegir sin arrepentirte
La pregunta llega casi siempre igual: “¿Kafka o RabbitMQ?”. Y casi siempre es la pregunta equivocada, porque ninguno de los dos es mejor: resuelven problemas distintos con modelos distintos.
Lo que sí se puede hacer es ordenar la decisión. En esta guía comparo las tres familias de mensajería —brokers tradicionales, plataformas de streaming y servicios serverless— con los cinco criterios que de verdad deciden: quién consume, si necesitas replay, qué debe ir ordenado, cuánto enrutamiento y cuánta operación puedes sostener.
Si es tu primera vez por aquí, esta es la vista de conjunto: empieza por el criterio que más te duela y salta al artículo que lo desarrolla.
Elegir broker por moda es como alquilar un camión para llevar una carta: arranca, cumple y te deja pagando peaje, seguro y plaza de garaje. La herramienta grande no es un problema hasta que llegan la factura y las guardias.
Tres familias, tres filosofías
1. Brokers de mensajes: RabbitMQ, ActiveMQ, Artemis, IBM MQ
Modelo smart broker, dumb consumer. El broker sabe quién ha recibido qué, aplica enrutamiento avanzado (exchanges, routing keys, cabeceras), gestiona prioridades y entrega a los consumidores. Es el modelo de RabbitMQ.
El mensaje vive hasta que alguien lo confirma. Después desaparece. Es un sistema de reparto de trabajo, no un archivo.
2. Event streaming: Kafka, Pulsar, Redpanda
Modelo dumb broker, smart consumer. El broker guarda un log inmutable en disco, particionado y ordenado. No decide a quién entregar: el consumidor pide y avanza su propio puntero con un offset. Es el modelo de Kafka.
El mensaje no se borra al leerse. Persiste por tiempo o tamaño, y por eso se puede releer. Es un sistema de registro de hechos, no de reparto.
Pulsar añade una capa de almacenamiento separada (BookKeeper) y suscripciones que mezclan ambos mundos. Redpanda implementa la API de Kafka en C++ y elimina la JVM. Son variantes del mismo paradigma, no herramientas distintas.
3. Mensajería serverless: SQS, SNS, Pub/Sub, Service Bus
Infraestructura gestionada, sin clústeres, como SQS y SNS. Colas estándar o FIFO, escalado automático, ventanas de visibilidad y DLQ. El mensaje se borra explícitamente por API tras procesarlo.
Es la opción con menos operación y menos control. Para el 80% de los equipos pequeños, la ecuación sale a favor.
La tabla que resume todo
| Característica | RabbitMQ | Kafka | SQS (+ SNS) |
|---|---|---|---|
| Paradigma | colas transaccionales y pub/sub | log distribuido append-only | cola gestionada |
| Despacho | push (con prefetch) | pull por lotes | pull (corto o largo) |
| Persistencia | efímera tras ACK | duradera por retención | hasta 14 días |
| Enrutamiento | muy flexible: direct, topic, fanout, headers | mínimo: partición por clave | ninguno; el fan-out lo da SNS |
| Orden | por cola, con un consumidor | por partición | FIFO por grupo / best-effort |
| Throughput | decenas de miles/s por nodo | cientos de miles/s por broker | automático; FIFO limitado |
| Prioridades | sí | no | no |
| Replay | no | sí | no |
| Operación | media | media-alta | nula |
| Coste | servidor o gestión | clúster o gestión | por petición |
La columna que más se ignora es operación, y es la que más caro sale. Un Kafka autogestionado con tres brokers, disco, upgrades y rebalances es un trabajo a tiempo parcial. Un SQS es una línea de código.
Las cinco preguntas que deciden
1. ¿Quién consume?
- Un worker que reparte tareas → cola. RabbitMQ o SQS.
- Varios equipos que necesitan el mismo flujo, cada uno a su ritmo → log. Kafka.
- Varios servicios que necesitan una copia de la notificación → pub/sub. SNS con colas detrás, o fanout de RabbitMQ.
2. ¿Necesitas volver atrás?
Si mañana descubres un bug de cálculo y quieres reprocesar los últimos tres días, la respuesta es Kafka. Ni RabbitMQ ni SQS te lo dan: cuando el mensaje se confirma, se borra.
Ese requisito, por sí solo, descarta dos de las tres opciones.
3. ¿Qué necesita estar ordenado?
- Nada: cola estándar.
- Por pedido o cuenta: Kafka con la clave correcta, o SQS FIFO con grupos.
- Todo el sistema: una sola partición o un solo consumidor. Y prepárate para el techo de throughput.
“Orden global” casi nunca es un requisito real. Casi siempre es “orden por entidad”, que es mucho más barato.
4. ¿Cuánto enrutamiento necesitas?
- Enrutar por tipo de evento a colas distintas: exchange
topicde RabbitMQ. - Enrutar por atributos: SNS filter policies o EventBridge.
- Enrutar por contenido complejo con reglas y esquemas: EventBridge.
- Nada: una cola y un worker.
5. ¿Quién se levanta a las tres de la mañana?
Si la respuesta es “nadie, somos dos”, la operación pesa más que cualquier característica. Un broker que no sabes operar es una deuda, no una ventaja.
El árbol de decisión
¿Necesitas releer eventos del pasado o auditar el flujo?
├── Sí ──▶ ¿Necesitas millones de eventos/día y varios consumidores?
│ ├── Sí ──▶ Kafka (o Redpanda / Pulsar)
│ └── No ──▶ Kafka pequeño o Postgres + outbox
└── No ──▶ ¿Necesitas enrutamiento complejo o prioridades?
├── Sí ──▶ RabbitMQ
└── No ──▶ ¿Quieres cero operación?
├── Sí ──▶ SQS (+ SNS si hay fan-out)
└── No ──▶ RabbitMQ gestionado o SQS
Si el árbol te lleva a “Postgres + outbox”, no es un fracaso. Es la decisión más sensata para miles de eventos al día: una tabla, un worker y FOR UPDATE SKIP LOCKED. Menos piezas, menos fallos.
El coste real, con números
Hagamos el ejercicio con 10 millones de eventos al mes. Precios públicos de referencia; compruébalos antes de presupuestar.
| Opción | Coste aproximado/mes | Notas |
|---|---|---|
| SQS estándar | 15-25 $ | unas 3 peticiones por mensaje |
| SNS + SQS (fan-out a 3 colas) | 30-50 $ | publicaciones + peticiones |
| RabbitMQ gestionado pequeño | 30-100 $ | según proveedor y HA |
| RabbitMQ autogestionado | 20-40 $ + horas | VPS y tu tiempo |
| Kafka gestionado (MSK) | 400-700 $ | mínimo 3 brokers |
| Kafka autogestionado | 150-300 $ + horas | 3 VPS, disco, operación |
La fila que decide muchas conversaciones no es la del coste de infraestructura: es la de las horas. Un ingeniero a media jornada manteniendo un clúster cuesta mucho más que la diferencia entre SQS y MSK.
Y hay un coste que no se ve: el coste de equivocarse. Migrar de SQS a Kafka seis meses después es más caro que empezar con SQS y subir cuando el requisito de replay aparezca de verdad.
Escenarios concretos
| Escenario | Elección razonable | Por qué |
|---|---|---|
| Generar facturas en segundo plano | SQS o RabbitMQ | tarea, reintentos, sin replay |
| Miniaturas de imágenes | SQS | picos enormes, cero operación |
| Eventos de pedido para 4 servicios | Kafka | varios consumidores, auditoría |
| Notificar a 5 servicios a la vez | SNS → SQS | fan-out gestionado |
| Auditoría y reconstrucción de estado | Kafka | retención y replay |
| Telemetría de miles de dispositivos | Kafka | volumen y retención |
| Enrutar por tipo de evento | RabbitMQ topic | routing keys |
| RPC entre servicios | HTTP/gRPC | no es mensajería |
| Tareas programadas | EventBridge Scheduler | no es una cola |
Los anti-patrones que veo una y otra vez
1. Kafka como bus RPC. Montar un topic de peticiones y otro de respuestas para simular llamadas síncronas. Si necesitas una respuesta inmediata, usa HTTP. Kafka no está diseñado para eso y la latencia te lo recuerda.
2. Kafka para 1.000 eventos al día. Tres brokers, un schema registry y un equipo sin experiencia para mover el equivalente a un cron. El coste operativo se come el beneficio.
3. SQS como event store. Borras el mensaje al procesarlo. Si necesitas el histórico, no hay nada que consultar.
4. RabbitMQ para analytics con replay. Un fanout copia, pero no retiene. Cuando necesitas reprocesar, ya no están.
5. Fan-out sin filtros. Todos los suscriptores reciben todo. Multiplicas el coste y el ruido.
6. Asumir exactly-once. Los tres sistemas, en la práctica, entregan al menos una vez. La idempotencia es tu responsabilidad, no una casilla de configuración.
7. Una cola para todo. Mezclar correos, facturas y webhooks en la misma cola hace imposible razonar sobre prioridades, reintentos y DLQ.
8. Sin DLQ ni alarmas. Los mensajes fallidos desaparecen y nadie se entera hasta que un cliente pregunta.
La dimensión que no sale en las tablas: el equipo
Elige la herramienta que tu equipo puede operar, no la que gana en un benchmark.
- ¿Sabéis diagnosticar un
consumer lagque crece? - ¿Tenéis un plan para un disco lleno en un broker?
- ¿Alguien ha hecho un upgrade de Kafka sin downtime?
- ¿Hay guardias y runbooks?
Si la respuesta es no, el orden correcto es SQS primero, RabbitMQ gestionado si necesitas enrutamiento, y Kafka cuando el requisito de replay y volumen sea real y tengas a alguien que lo sostenga.
La recomendación final
- Equipo de 1 a 5 personas, tareas asíncronas y notificaciones: SQS + SNS. Cero operación, coste ridículo.
- Enrutamiento complejo, prioridades o protocolos como MQTT/STOMP: RabbitMQ.
- Varios consumidores independientes, auditoría, replay, volumen alto: Kafka.
- Eventos de negocio en una app pequeña: Postgres + outbox. Sí, en serio.
Y una regla que ahorra muchos disgustos: empieza por la opción más simple que cumpla el requisito de hoy, no el de dentro de tres años. La mensajería se puede cambiar; el tiempo perdido operando algo que no necesitabas, no.
Para seguir leyendo
- RabbitMQ: exchanges, ACKs y el trabajo que no puede perderse
- Kafka no es una cola de mensajes: qué resuelve y cuándo no usarlo
- SQS y SNS: mensajería serverless sin operar nada (y sus trampas)
Las tres piezas comparten una idea: el broker no arregla el diseño. Solo lo hace explícito.