🧪 Problem-Driven Systems Lab

🗺️ Contexto#

El productor va más rápido que el consumidor. La cola interna absorbe la diferencia sin quejarse, la memoria del proceso crece, y una madrugada el OOM killer lo mata. O peor: la cola tenía un límite silencioso y los mensajes se perdieron sin que nadie se enterara.

Justificación#

Lo que hace difícil este caso es que la cola sin límite se ve bien en todas las métricas que la gente mira. El throughput es alto. No hay errores. No hay descartes. El productor nunca espera.

Las dos métricas que lo delatan casi nunca están en el dashboard: la profundidad de la cola y la edad del mensaje más viejo. Un sistema que procesa 1.000 mensajes por segundo con una cola de 400.000 mensajes está entregando resultados de hace siete minutos, y su gráfico de throughput no lo dice.

La otra mitad del problema es conceptual. Cuando se le pone límite a la cola hay que elegir qué pasa cuando se llena, y las tres opciones cuestan algo: frenar al productor traslada la lentitud aguas arriba, descartar pierde datos, y la dead letter queue muda el problema a otra cola que alguien tiene que mirar. No existe una cuarta opción gratis — y una cola sin límite parece serlo justamente porque el costo llega después y de golpe.

📇 Ficha del caso#

CategoríaResiliencia
EstadoOPERATIVO
Stacks operativos7 de 7

Productores más rápidos que consumidores: la cola sin límite crece hasta el OOM y la acotada obliga a elegir entre frenar, perder o mudar el problema.

🧱 Dónde correrlo#

StackVersiónURL en el hubImplementación
🐘 PHPPHP 8.3http://localhost:8100/15/README
🐍 PythonPython 3.12http://localhost:8200/15/README
🟢 Node.jsNode.js 22http://localhost:8300/15/README
☕ JavaJava 21http://localhost:8400/15/README
🔵 .NET.NET 8http://localhost:8500/15/README
🐹 GoGo 1.23http://localhost:8600/15/README
🦀 RustRust 1.83http://localhost:8700/15/README

⚠️ Nota de honestidad del caso: la cola vive dentro del proceso y los mensajes son objetos en memoria, no un broker real. El tiempo de consumo es una espera, que es el modelo fiel: un consumidor se demora esperando I/O, no quemando CPU. En PHP el productor y el consumidor son pasos del mismo bucle porque el lenguaje no tiene concurrencia dentro del proceso.


Caso 15 · Backpressure en colas de mensajes⬅️ README del caso · ⚖️ Comparativa de los 7 stacks

🗺️ Contexto · 🩺 Síntomas · 🔍 Diagnóstico · 🧠 Causas raíz · 🛠️ Opciones de solución · ⚖️ Trade-offs · 💼 Valor de negocio · 🚨 Postmortem

Ver esta carpeta en GitHub ↗