Playbook

DDD en producción: sistemas distribuidos y estrategias de modernización (Ddd EN Produccion Sistemas Distribuidos Y Estrategias DE Modernizacion)

¿Cómo implementar DDD en un entorno de producción? Guía de conversión heredada con Event Storming, Saga, Transactional Outbox, Capa anticorrupción y Strangler Fig.

DDD: lenguaje empresarial del software

Parte 4 de 4

Production DDD practices for event discovery, legacy modernization, and safe distributed change

The map for this chapter

This chapter is not a list of patterns to memorize. It follows how business truth inside a monolith can move safely while the system changes.

Monolith
   ↓
Event Storming
   ↓
Bounded Context
   ↓
Saga
   ↓
Outbox
   ↓
Strangler Fig
   ↓
Production

La verdadera cuestión en Producción

Trazar límites con DDD es el comienzo. En producción, la verdadera prueba es mantener el sistema y la confianza del usuario a medida que estos límites cambian. Puede resultar tentador reescribir un flujo de pedidos dentro del monolito heredado de la noche a la mañana; Pero ésta suele ser la opción más arriesgada.```text Monolith → mevcut iş gerçeği Yeni bağlam → daha temiz model Kademeli geçiş → ölçülebilir güven


## Conceptos en la primera mención```text
📦 Event Storming
İş olaylarını, komutları ve riskleri birlikte görünür kılan keşif atölyesi.

📦 Saga
Dağıtık bir iş akışındaki yerel işlemleri ve başarısızlıktaki iş telafisini yöneten model.

📦 Transactional Outbox
Veri değişikliği ile yayınlanacak event'i aynı yerel transaction içinde kaydeden desen.

📦 Strangler Fig
Legacy sistemi tek seferde değiştirmek yerine yeni sınırlarla adım adım saran dönüşüm stratejisi.
```Un evento de dominio es un hecho comercial escrito en tiempo pasado: `SiparişOnaylandı`. El comando es la intención: `SiparişiOnayla`. Esta distinción es necesaria; Como la intención puede rechazarse, un hecho ocurrido es un registro ante el cual otros contextos pueden reaccionar con confianza.

## Encuentra primero la transmisión invisible con Event Storming

La transformación de la producción comienza con el flujo de trabajo, no con el inventario de códigos. Producto, operaciones e ingeniería están en la misma pared, enumerando eventos en tiempo pasado; Agrega comandos, actores, sistemas externos y puntos rojos.```text
SiparişOnaylandı ← SiparişiOnayla ← Customer
       ↓
StokRezerveEdildi ← StokRezerveEt
       ↓
ÖdemeAlındı ← ÖdemeyiAl ← Payment Gateway
```Lea también el flujo de un extremo a otro. Narrativa inversa; Hace visibles las decisiones ocultas por el camino feliz, como el reembolso, el pago parcial, el tiempo de espera y la intervención manual. Un contexto acotado no es un nombre de tabla; La decisión se encuentra donde cambian el idioma y la propiedad.

## Saga: no retroceso, compensación laboral

No existe una única transacción ACID cuando el pago, el inventario y la entrega se encuentran en contextos diferentes. 2PC puede prometer una gran coherencia; Sin embargo, en caso de falla del coordinador o participante, conlleva una tarifa de retención de candado y accesibilidad. Saga, en cambio, define una compensación por cada paso local.```text
Reserve inventory → Capture payment → Create shipment
                 payment fails → Release inventory
````ReleaseInventory` también debe ser idempotente; Si el mismo evento ocurre dos veces, la acción no debería aumentar dos veces. En transmisiones cortas y locales, la coreografía puede ser suficiente. Orquestación en procesos de varios pasos y de visibilidad crítica; Proporciona una máquina de estados y un único punto de observación.

## Bandeja de salida y trazabilidad: hacer que la migración sea demostrable

Si no se puede acceder al corredor mientras se confirma una orden, se produce una brecha de doble escritura entre la base de datos y la publicación del mensaje. Por eso existe Outbox.```text
Local transaction
  → Order'ı kaydet
  → OrderConfirmed'i Outbox'a yaz
  → Commit

Relay → Broker → Consumer → Projection
```Los consumidores deben esperar mensajes duplicados al menos una vez en la entrega. Se deben verificar el ID del evento, la versión agregada y el impacto comercial. El ID de correlación indica la parte de un flujo de un extremo a otro y el ID de causa indica qué decisión produjo el evento. Estos no son campos de registro; "¿Qué pasó?" en el momento del incidente. y "¿por qué sucedió?" es la respuesta a tus preguntas.

## Conversión heredada con Strangler Fig

La transformación radical implica el riesgo de perder comportamientos antiguos antes de que se descubran las reglas de negocio. Importe el nuevo contexto junto al heredado; primero mida los datos y la diferencia de comportamiento, luego impulse el tráfico.```text
1. Replication only  → yeni modele veri akıt
2. Shadow reads      → eski ve yeni cevabı karşılaştır
3. Partial reads     → küçük trafik yüzdesini yönlendir
4. Write migration   → yeni sınırda yaz, geri uyumu koru
5. Full cutover      → metriklerle doğrulanmış geçiş
6. Decommission      → köprüleri ve eski kodu kaldır
```La Capa Anticorrupción es aquí el escudo del nuevo modelo. En lugar de mover los campos ambiguos del legado directamente al dominio, traduce: `LEGACY_ORDER_STATE=7` se convierte en un `FulfilmentStatus` significativo en el nuevo contexto. Así, el efecto del modelo sucio permanece en un único adaptador.

## Criterio de aceptación: capacidad de reversión, no solo implementación

El éxito de la migración no depende sólo de la capacidad de respuesta del nuevo punto final. La tasa de diferencia de lectura en sombra, la diferencia de retraso de P95, el retraso del consumidor, la profundidad de DLQ y el plan de reversión deben ser visibles. El costo de repetición es O(n) dependiendo del número de eventos; La reproducción instantánea o segmentada puede reducir este costo, pero no sustituye el historial verificado.

Un sistema que no se puede observar no se puede gestionar. Cada contrato de evento debe tener un propietario, una estrategia de lanzamiento, una alerta y un runbook de reproducción.

## Coincidencias que crean falsa confianza```text
❌ DDD = mikroservis dönüşümü
✓ DDD önce iş dilini ve karar sınırını korur; mikroservis bazen sonuçtur.

❌ Saga = teknik rollback
✓ Saga, geri alınamayan iş etkisini telafi eden iş akışıdır.

❌ Outbox = exactly-once teslimat
✓ Outbox event kaybını önler; consumer yine duplicate için idempotent olmalıdır.

❌ Shadow read = test tamamlandı
✓ Karşılaştırma, canlı trafikte davranış farkını ölçen uzun süreli kanıttır.

❌ ACL = gereksiz katman
✓ ACL, legacy dilinin yeni domain'i kirletmesini engeller.

Lista de verificación de preparación de producción

  1. ¿Son visibles en Event Storming los puntos calientes y los sistemas externos distintos del camino feliz?
  2. ¿Está definida la compensación idempotente para cada paso de Saga?
  3. ¿Outbox cierra la brecha entre el registro de la base de datos y el evento en caso de falla del corredor?
  4. ¿Existe observabilidad para la identificación de correlación, la identificación de causalidad, el retraso del consumidor y el DLQ?
  5. ¿El nuevo contexto protege el modelo heredado con ACL?
  6. ¿Se han establecido umbrales mensurables para la lectura en la sombra, el tráfico en cascada y la reversión?
  7. ¿Está clara la fecha y el propietario de los puentes antiguos?

La complejidad de una transformación no se mide por la cantidad de servicios. El cambio independiente se mide mediante el aislamiento de errores y la prueba de devolución.

Lo que debes recordar de este artículo

  1. DDD en producción significa que el modelo se mantiene fiel al lenguaje empresarial en proceso de cambio.
  2. Event Storming descubre decisiones y riesgos que son invisibles ante el código.
  3. Saga, Outbox e idempotencia aceptan fallas distribuidas como entrada de diseño.
  4. Strangler Fig y ACL dividen la conversión heredada en pasos verificables en lugar de un solo salto.

La modernización no consiste en destruir el antiguo sistema; es establecer un ritmo de cambio más seguro sin perder el valor del negocio.

FAQ

Frequently asked questions

¿Qué es la tormenta de eventos?

Taller de descubrimiento que visibiliza eventos, comandos y riesgos empresariales en conjunto.

¿Qué es Saga?

Modelo que gestiona operaciones locales y recuperación de trabajos en caso de falla en un flujo de trabajo distribuido.

¿Es correcta "DDD = conversión de microservicio"?

DDD primero preserva el lenguaje comercial y los límites de decisión; A veces el resultado es un microservicio.

¿Qué soluciona esta sección?

El objetivo no es producir más servicios. El objetivo es que cuando cambie el lenguaje del negocio, el sistema también pueda cambiar de forma segura. DDD en producción significa que el modelo se mantiene fiel al lenguaje empresarial en proceso de cambio. Trazar límites con DDD es el comienzo. En producción, la verdadera prueba es mantener el sistema y la confianza del usuario a medida que estos límites cambian. Puede resultar tentador reescribir un flujo de pedidos dentro del monolito heredado de la noche a la mañana; Pero ésta suele ser la opción más arriesgada.

Principios de ingeniería aprendidos

  • La producción DDD requiere que los eventos y los límites mantengan el significado comercial bajo error.
  • Saga, Outbox e idempotencia; Reconoce que la entrega distribuida es la norma, no la excepción.
  • Con Strangler Fig, ACL mantiene el cambio en la transformación heredada pequeño, mensurable y reversible.

Continuar leyendo

Continuar leyendo

Siguiente en la serie

Misma serie

Misma serie

Paylaş