- Se evaluó con benchmarks el rendimiento de publish/subscribe (pub-sub) y colas (queue) de Postgres, mostrando que incluso una sola base de datos puede potencialmente reemplazar un sistema de mensajería
- En un solo nodo de 4 vCPU logró 5,036 escrituras y 25,183 lecturas por segundo, y mantuvo un rendimiento similar incluso en un entorno replicado de 3 nodos, con una latencia de extremo a extremo de 186 ms (p99)
- En un nodo grande de 96 vCPU alcanzó 238 MiB/s de escritura y 1.16 GiB/s de lectura, confirmando capacidad de procesamiento holgada con un uso de CPU inferior al 10%
- En las pruebas de colas también pudo procesar 2,885 operaciones por segundo en un solo nodo y 2,397 en un entorno replicado, un rendimiento suficiente para la mayoría de las empresas
- Demuestra que, en lugar de sistemas distribuidos complejos, una sola infraestructura con Postgres puede manejar cargas de trabajo de varios MB/s, y enfatiza un enfoque práctico: “usa tecnología simple hasta que realmente necesites otra cosa”
Los dos bandos de la elección tecnológica
- La industria tecnológica se divide entre el bando guiado por palabras de moda y el bando guiado por el sentido común
- El primero se siente atraído por términos de marketing como “tiempo real”, “escalado infinito” o “impulsado por IA”
- El segundo prioriza la simplicidad y la practicidad, y evita la complejidad innecesaria
- Últimamente, dos corrientes han reforzado al segundo grupo: Small Data y el renacimiento de Postgres
- Los datos se hacen más pequeños y el hardware se vuelve más potente
- Postgres puede reemplazar varias soluciones especializadas con un solo sistema (
jsonb, pgvector, tsvector, etc.)
Resumen del benchmark
- Objetivo: medir hasta qué punto Postgres puede escalar en mensajería pub/sub y procesamiento de colas
- Entorno de prueba: AWS EC2
c7i.xlarge (4 vCPU) y c7i.24xlarge (96 vCPU)
- Comparación entre tres configuraciones
- Nodo único
- Clúster replicado de 3 nodos
- Nodo único de gran tamaño
Resultados del benchmark de pub/sub
- Nodo único de 4 vCPU
- Escritura de 4.8 MiB/s (5,036 msg/s), lectura de 24.6 MiB/s (25,183 msg/s), latencia de 60 ms (p99)
- Uso de CPU del 60%, escritura en disco de 46 MiB/s
- Replicación de 3 nodos con 4 vCPU
- Escritura de 4.9 MiB/s, lectura de 24.5 MiB/s, latencia de 186 ms (p99)
- Se mantiene el rendimiento, con un costo anual aproximado de $11,514
- Nodo único de 96 vCPU
- Escritura de 238 MiB/s (243k msg/s), lectura de 1.16 GiB/s (1.2M msg/s), latencia de 853 ms (p99)
- CPU por debajo del 10%; el cuello de botella está en la velocidad de escritura por partición
- Conclusión: puede competir con Kafka en cargas de trabajo pequeñas y medianas, y con una arquitectura simple puede procesar decenas de MB/s
Resultados del benchmark de colas
- Implementación de cola simple basada en
SELECT FOR UPDATE SKIP LOCKED
- Nodo único de 4 vCPU
- 2.81 MiB/s (2,885 msg/s), latencia de 17.7 ms (p99), CPU al 60%
- Replicación de 3 nodos con 4 vCPU
- 2.34 MiB/s (2,397 msg/s), latencia de 920 ms (p99), CPU al 60%
- Nodo único de 96 vCPU
- 19.7 MiB/s (20,144 msg/s), latencia de 930 ms (p99), CPU entre 40% y 60%
- Incluso un solo nodo puede cubrir las necesidades de rendimiento de colas de la mayoría de las empresas
Cuándo elegir Postgres
- En la mayoría de los casos, elegir Postgres por defecto es razonable
- Permite depurar, modificar y hacer joins sobre mensajes con SQL
- Frente a Kafka, simplifica la operación y facilita el mantenimiento
- Kafka está optimizado para alto rendimiento, pero para cargas pequeñas puede ser una elección excesiva
- Se cita la advertencia de Donald Knuth: “la optimización prematura es la raíz de todos los males”
- Hasta varios MB/s, Postgres es suficiente
Enfoque de MVI
- Minimum Viable Infrastructure: construir el sistema mínimo con tecnologías que la organización ya conoce
- Postgres está ampliamente adoptado y es fácil encontrar talento que lo maneje
- Cuantos menos componentes haya, menor será la carga operativa y el riesgo de fallas
- Introducir tecnologías innecesarias genera sobrecarga organizacional
- Aumentan los costos de aprendizaje, monitoreo, despliegue y operación
Debate sobre escalabilidad
- Postgres realmente puede escalar
- OpenAI sigue usando Postgres basado en una sola instancia de escritura
- Opera de forma estable incluso a escala de cientos de millones de usuarios
- La mayoría de las empresas crecen de forma gradual, así que hay margen de años antes de necesitar un cambio tecnológico
- Diseñar “por si se vuelve viral” es un sobrediseño excesivo
- Se compara con “comprar un amplificador Marshall para abrirle a Coldplay”
Conclusión
- “Usa Postgres hasta que se rompa”
- Incluso con tecnología simple se puede obtener un rendimiento bastante alto
- Introducir sistemas distribuidos complejos antes de necesitarlos es ineficiente
- Junto con el hardware moderno, Postgres es una opción práctica capaz de soportar la mayoría de las cargas de trabajo
1 comentarios
Comentarios en Hacker News
Aplicar el principio de Pareto a todo es una interpretación errónea
Decir que Postgres cubre el 80% de los casos de uso de Kafka con el 20% del esfuerzo es una afirmación sin fundamento
El principio de Pareto solo tiene sentido en situaciones donde aparece una distribución de ley de potencias
Basta con decir que Postgres cubre suficientes casos de uso, es estable y es una herramienta probada
Por experiencia trabajando desde escalas pequeñas (cientos de eventos por hora) hasta grandes escalas (billones de eventos por hora), primero hay que preguntarse si de verdad hace falta una cola
UPDATEson especialmente dolorososEs riesgoso usar Postgres para todo
Los locks y niveles de aislamiento no son intuitivos y pueden crear cuellos de botella de rendimiento
Llevo décadas usando Postgres, pero no se debe diseñar con una fe ciega
LISTEN/NOTIFYno escala (enlace relacionado)Me parece efectivo el enfoque de una tabla de log de eventos basada en SQL
Pero la desventaja es la falta de herramientas del lado del cliente. Ahí Kafka tiene la ventaja de un ecosistema rico de librerías
En nuestra empresa estandarizamos el envío de eventos entre servicios con una base SQL (feedapi-spec)
No está tan maduro como Kafka, pero podría evolucionar hacia un stack común de librerías compatible con varios motores de almacenamiento
Últimamente la gente tiende a sentirse demasiado atraída por las tecnologías nuevas
Postgres es excelente, pero hay que usar la herramienta adecuada para el problema
Postgres no fue diseñado para pub-sub, Kafka sí fue creado para eso
Hay que evitar la tendencia de productos que quieren “hacerlo todo”. Creo que son mejores las herramientas que hacen una sola cosa bien
Implementar "números de offset monótonamente crecientes" es un problema complicado
Una secuencia simple causa problemas porque el orden de la transacción y el momento del commit pueden no coincidir
SELECT FOR UPDATE SKIP LOCKEDQueda la duda de si realmente hicieron benchmarks de Kafka
Los resultados obtenidos en un entorno de 96 vCPU también se pueden lograr con una configuración de Kafka de 4 vCPU
El rendimiento de Postgres es anormalmente lento
Si no hace falta Kafka, no lo uses, pero presumir 5k msg/s con Postgres no significa gran cosa
Existen dos extremos: “la gente obsesionada con tecnologías nuevas” y “la gente que solo insiste en lo que ya aprendió”
Un ingeniero realista toma una decisión práctica en algún punto intermedio
La funcionalidad clave de Kafka es el control de offsets por consumidor
En entornos donde varios equipos leen el mismo tópico, es una función indispensable
Poder mover el offset hacia adelante o hacia atrás me ha salvado más de una vez
Me pregunto si una cola en Postgres soporta ese tipo de función
La idea de “el bando que persigue buzzwords vs. el bando del sentido común” en sí misma está equivocada
Reimplementar Kafka con Postgres no es sentido común
Si de verdad necesitas funcionalidades al nivel de Kafka, entonces simplemente usa Kafka