Patrón CQRS

En el post de Event Sourcing vs CRUD mencionamos a CQRS como el complemento natural, sin desarrollarlo. Le toca su propio espacio, porque resuelve un problema muy común incluso en sistemas que no usan Event Sourcing en absoluto. Tenés un catálogo de productos. Las escrituras son poco frecuentes: un producto se actualiza una vez al…

Feature Flag

Tu equipo pasó tres semanas construyendo un nuevo motor de búsqueda para el catálogo. El viernes está listo. ¿Lo despliegan y esperan que funcione perfecto para todos los usuarios al mismo tiempo, con el riesgo de que un bug afecte a toda la base de usuarios de un solo golpe? ¿O esperan al lunes con…

Idempotency Keys

Un cliente está en el checkout de tu tienda. Hace clic en “Pagar”. La conexión tarda un poco, no ve respuesta inmediata, y hace clic de nuevo. O peor: su app reintenta automáticamente tras un timeout, sin que el usuario haga nada. Resultado: dos cargos idénticos en su tarjeta por la misma orden. Ya mencionamos…

Patrón Builder

¿Alguna vez llamaste a un constructor con ocho o diez parámetros y tuviste que contar con el dedo cuál posición correspondía a cuál campo? new HttpRequest(“GET”, url, null, null, true, 30, null, false, 3) — ¿cuál de esos booleanos era followRedirects y cuál era verifySSL? Sin abrir la definición de la clase, es imposible saberlo…

Patrón Caché Distribuido

En el post del Patrón Singleton vimos cómo cachear una lista de empleados dentro de una sola instancia de aplicación. Funciona perfecto — hasta que tu aplicación crece y ya no corre en una sola instancia, sino en diez, detrás de un balanceador de carga. Ahora cada instancia tiene su propio caché en memoria, desincronizado…

Patrón Rate Limit

Publicaste tu API pública. A la semana, un solo cliente — sin mala intención, probablemente un script mal configurado en un loop infinito — te está mandando 500 requests por segundo. Tu base de datos, diseñada para un tráfico mucho más razonable, empieza a responder lento. Y ese cliente sobrecargado está afectando a todos los…

Patrón Outbox

Tu servicio de órdenes hace dos cosas cuando se crea una orden: guarda la orden en la base de datos, y publica un evento OrderCreated a Kafka para que el servicio de inventario y el de facturación se enteren. Código simple: ¿Qué pasa si el servidor se cae justo entre la línea 1 y la…

Patrón Bulkhead

Tu aplicación tiene un endpoint de checkout que llama a tres servicios: pagos, envíos y notificaciones. Un día, el servicio de notificaciones — el menos crítico de los tres, el que manda el correo de “tu orden fue recibida” — empieza a responder lento. Nada grave, pensarías. Pero a los cinco minutos, el checkout completo…

Event Sourcing vs CRUD: ¿cuándo usar cada uno?

Un cliente de una fintech (empresa de tecnología financiera) llama a soporte: “Mi saldo dice $500 pero yo tenía $800 la semana pasada. ¿Qué pasó?”. El agente de soporte abre el sistema y encuentra… una fila en la base de datos que dice balance = 500. Nada más. La historia de cómo se llegó a…

SOLID en la práctica – más allá de las definiciones

Preguntale a cualquier desarrollador qué significa SOLID (Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion — Responsabilidad Única, Abierto/Cerrado, Sustitución de Liskov, Segregación de Interfaces e Inversión de Dependencias) y probablemente te recite las cinco definiciones sin problema. Ahora pedile que te muestre su último pull request… y ahí es donde la historia cambia.…