CQRS en Django: un read model desnormalizado sin Event Sourcing

CQRS en Django: un read model desnormalizado sin Event Sourcing

Los cuatro artículos anteriores de la serie pusieron las bases para que un sistema distribuido se mantenga coherente: Saga para orquestar workflows, Outbox para publicar eventos fiables, Inbox para consumirlos sin duplicados, Idempotency Keys para proteger la API. Queda una pregunta: ¿qué se hace con los eventos una vez publicados? La respuesta más frecuente es: se usan para construir vistas de lectura. Es exactamente lo que propone el patrón CQRS (Command Query Responsibility Segregation): separar el modelo de escritura del modelo de lectura, cuando ambos divergen lo suficiente como para que forzarlos en una misma estructura cueste más que duplicarlos. ...

5 de junio de 2026 · 8 min · Anthony
Idempotency Keys: evitar que un cliente pague dos veces

Idempotency Keys: evitar que un cliente pague dos veces

Los dos artículos anteriores trataron la idempotencia del lado evento: el patrón Outbox garantiza que un mensaje se publica al menos una vez, y el patrón Inbox garantiza que solo se consume una vez. Queda un tercer lugar donde aparece el mismo problema, más arriba: la propia API HTTP. Cuando un cliente lanza un POST /api/payments y su conexión se cae antes de recibir la respuesta, no sabe si el pago se creó o no. Si reintenta, arriesga pagar dos veces. Si no reintenta, arriesga no pagar nada. El patrón Idempotency Key, popularizado por Stripe y adoptado desde por la mayoría de APIs de pago, resuelve ese dilema poniendo el control del retry en manos del cliente. ...

4 de junio de 2026 · 8 min · Anthony
Patrón Inbox: consumir eventos sin reproducirlos dos veces

Patrón Inbox: consumir eventos sin reproducirlos dos veces

El artículo anterior sobre el Transactional Outbox estableció una garantía clara: todo evento escrito en base acabará siendo publicado. Esa garantía es intencionadamente at-least-once. Un consumidor puede recibir el mismo evento dos veces, tres veces, o más si la red se porta mal. El patrón Outbox nunca promete unicidad. La consecuencia es inmediata: si el consumidor aplica dos veces el efecto del mensaje, factura dos veces, envía dos correos, descuenta stock dos veces. La coherencia garantizada del lado productor se rompe del lado lector. ...

3 de junio de 2026 · 7 min · Anthony
Transactional Outbox: publicar eventos sin perder la coherencia

Transactional Outbox: publicar eventos sin perder la coherencia

Cuando un servicio modifica su base y quiere avisar al resto del sistema enviando un evento a Kafka, RabbitMQ o SQS, el código ingenuo se parece a esto: escribir en base y luego publicar. Si la publicación falla tras el commit, el evento se pierde. Si la publicación tiene éxito pero el commit falla, el evento habla de un estado que no existe. Ambos casos son la definición del dual-write problem. ...

2 de junio de 2026 · 8 min · Anthony
Patrón Saga: gestionar transacciones distribuidas sin rollback

Patrón Saga: gestionar transacciones distribuidas sin rollback

Una operación de negocio que toca varios servicios plantea una pregunta que SQL resuelve desde hace cincuenta años dentro de una sola base de datos: ¿qué pasa cuando un paso tiene éxito y el siguiente falla? Mientras todo vive en la misma base, BEGIN ... ROLLBACK basta. En cuanto llamas a un servicio externo, una API de terceros u otra base de datos, esa red de seguridad desaparece. El patrón Saga responde a esa pregunta. En lugar de intentar una transacción ACID imposible, divide la operación en pasos locales, cada uno acompañado de una transacción compensatoria que sabe deshacer su efecto. Si el paso 4 falla, las compensaciones de los pasos 1, 2 y 3 se reproducen en orden inverso. ...

1 de junio de 2026 · 8 min · Anthony
Capa anti-corrupción: aislar tu código de las APIs externas

Capa anti-corrupción: aislar tu código de las APIs externas

Consumir una API externa parece inofensivo al principio. Haces un requests.get, recibes un diccionario, y lo usas tal cual en el resto del código. El problema empieza cuando esa misma estructura JSON termina diseminada en diez archivos, y la API renombra un campo o cambia price de float a string. Corregirlo se convierte en una búsqueda del tesoro. La capa anti-corrupción (Anti-Corruption Layer, o ACL) responde a este problema. Procedente del Domain-Driven Design, actúa como un traductor entre un sistema externo y tu lógica de negocio. Un solo punto de contacto, un solo lugar que modificar cuando la API cambia. ...

27 de mayo de 2026 · 5 min · Anthony
Connascencia Python: 9 tipos de acoplamiento explicados

Connascencia Python: 9 tipos de acoplamiento explicados

El acoplamiento se trata a menudo como una noción vaga: “está demasiado acoplado” no dice nada sobre qué cambiar concretamente. La connascencia proporciona un vocabulario preciso para nombrar las diferentes formas de acoplamiento, compararlas y decidir cuáles reducir primero. El concepto está documentado en detalle en connascence.io. Tres ejes para evaluar la connascencia Cada instancia de connascencia se analiza según tres ejes: Fuerza: cuanto más fuerte es la connascencia, más difícil es detectarla y refactorizarla. Grado: una entidad acoplada a cientos de otras es más problemática que una acoplada a dos. Localidad: dos componentes cercanos (misma clase, mismo módulo) pueden tolerar formas más fuertes. A distancia, esas mismas formas se vuelven peligrosas. Los 9 tipos de connascencia Connascencia de Nombre (CoN) Varios componentes se ponen de acuerdo sobre el nombre de una entidad. Es la forma más débil e inevitable. ...

11 de mayo de 2026 · 4 min · Anthony

Newsletter

Recibe los nuevos artículos directamente en tu bandeja de entrada.

Sin spam. Baja en un clic.