Marcio Cunha

Diseño de Microservicios Orientados al Dominio con Event Storming y Modelado Táctico

Aprenda a diseñar microservicios alineados al negocio utilizando Event Storming para mapear flujos y modelado táctico para estructurar código preciso.

Marcio Cunha•6 min
También disponible en:EnglishPortuguês
Resumen
  • El Event Storming elimina ambigüedades al reunir a expertos de negocio e ingenieros en un taller visual colaborativo.
  • Los eventos de dominio registran hechos pasados inmutables que guían la creación de flujos sistémicos eficientes.
  • El modelado táctico traduce límites conceptuales complejos en fronteras claras de microservicios.
  • El mapeo correcto de contextos delimitados reduce drásticamente el acoplamiento accidental entre bases de datos.
  • Las decisiones arquitectónicas sólidas emergen cuando el lenguaje ubicuo refleja exactamente el vocabulario diario de la operación.

El Desafío de Partir Sistemas en Microservicios

Cuando una aplicación crece, la tendencia natural es intentar dividirla en partes más pequeñas para facilitar el mantenimiento. Sin embargo, fragmentar un sistema sin un criterio comercial claro suele generar una pesadilla operativa conocida como monolito distribuido. En la práctica, esto significa que creas múltiples programas independientes que dependen tanto unos de otros que terminan colapsando juntos ante la menor señal de fallo. Para evitar esta trampa, la ingeniería de software moderna recurre a enfoques colaborativos que conectan directamente la lógica computacional con los objetivos reales de la empresa.

Arquitecturar microservicios eficientes requiere comprender que el software existe para servir a un dominio específico, es decir, al área de especialización y a los problemas que la empresa resuelve cada día. Si los desarrolladores crean divisiones basadas puramente en preferencias técnicas, como separar la base de datos de la interfaz sin mirar el flujo de valor, el resultado es el desorden. El secreto del éxito radica en alinear la estructura del código con la forma en que las personas que trabajan en el negocio piensan, conversan y ejecutan sus tareas cotidianas.

Entendiendo el Event Storming como Herramienta de Descubrimiento

El Event Storming es una dinámica de diseño altamente colaborativa desarrollada para explorar dominios de negocios complejos a un ritmo acelerado. En términos sencillos, reúne una sala llena de personas de diferentes áreas, como desarrolladores, evaluadores, analistas de negocio y operadores, armados únicamente con notas adhesivas de colores y una pared blanca. El foco inicial no es discutir bases de datos o frameworks, sino identificar los eventos que ocurren en el negocio. Un evento de dominio es siempre algo importante que ya ocurrió en el pasado, redactado en participio pasado, como pedido aprobado o pago rechazado.

Durante esta sesión, los participantes mapean la línea de tiempo de la empresa, identificando cada punto de inflexión donde una acción genera una reacción medible. Si el grupo nota que un evento determinado genera muchas dudas o discusiones acaloradas, se hace evidente que existe un punto crítico o un cuello de botella conceptual. En la práctica, esta claridad visual reemplaza pilas de documentos desactualizados con un entendimiento compartido e inmediato. Todos los involucrados comienzan a ver el sistema no como un montón de código, sino como una secuencia viva de eventos que entregan valor real a los clientes.

De la Línea de Tiempo a los Contextos Delimitados

Con la línea de tiempo repleta de eventos mapeados en las paredes, el siguiente paso consiste en agrupar estas tarjetas por afinidad funcional. Es en este momento cuando surgen los contextos delimitados, es decir, fronteras conceptuales claras donde un término específico posee un significado único e innegociable. Por ejemplo, la palabra cliente puede significar alguien que compra productos para el equipo de ventas, pero para soporte técnico, un cliente puede ser un titular de contrato activo. Reconocer estos matices evita que el código intente crear un modelo único y gigante que intente abarcar todas las definiciones simultáneamente.

Cada grupo de eventos fuertemente relacionados apunta directamente al contorno natural de un futuro microservicio. En lugar de adivinar dónde colocar la lógica, la dinámica de conversación misma revela dónde deben establecerse las barreras. Si un conjunto de eventos intercambia información constantemente y comparte las mismas reglas esenciales, probablemente pertenecen al mismo servicio autónomo. Esta claridad arquitectónica reduce drásticamente la necesidad de consultas cruzadas y dependencias síncronas complejas entre diferentes partes de la aplicación durante la ejecución.

Modelado Táctico y Estructuración del Código

Identificar los límites de los microservicios es solo el comienzo; dentro de cada frontera, es necesario aplicar el modelado táctico para construir el código de forma robusta. El modelado táctico se refiere a la traducción directa del conocimiento práctico y las reglas del negocio en estructuras de código limpias, expresivas y fáciles de mantener. En lugar de clases genéricas llenas de propiedades técnicas vacías, el modelado se centra en objetos que representan conceptos reales en ese contexto, como facturas, reglas de descuento o políticas de envío.

Para garantizar que este código permanezca cohesivo, se utilizan patrones tácticos consolidados como agregados y entidades. Un agregado funciona como un conjunto de objetos de dominio tratados como una sola unidad para propósitos de modificación de datos, asegurando la consistencia interna. A continuación se muestra un ejemplo práctico en Python de una estructura de dominio que encapsula reglas de negocio directamente en el objeto:

class Pedido:
    def __init__(self, pedido_id):
        self.pedido_id = pedido_id
        self.itens = []
        self.status = 'CREADO'
    def agregar_item(self, producto, precio):
        if self.status != 'CREADO':
            raise ValueError('No se puede modificar un pedido finalizado.')
        self.itens.append({'producto': producto, 'precio': precio})

Este tipo de enfoque evita que reglas de negocio vitales se dispersen por controladores de API o scripts de bases de datos. El comportamiento reside junto a los datos, haciendo que el sistema sea mucho más resiliente a futuros cambios y facilitando las pruebas automatizadas.

Comunicación Asíncrona y Consistencia Eventual

Cuando dividimos un sistema en microservicios utilizando límites orientados al dominio, surge un nuevo desafío técnico: cómo hacer que estas piezas conversen sin crear un acoplamiento rígido. En arquitecturas tradicionales, es común que un servicio realice llamadas directas vía HTTP a otro, creando una cadena de dependencias frágil donde la caída de un componente derriba todo el flujo. La solución robusta a este problema es adoptar la comunicación asíncrona basada en eventos, donde los microservicios publican avisos sobre lo que sucedió y otros servicios reaccionan a esta información a su propio ritmo.

Este modelo introduce la consistencia eventual, lo que significa que los datos entre diferentes servicios no necesitan estar sincronizados en el milisegundo exacto, pero convergerán al estado correcto en un corto intervalo de tiempo. En la práctica, si un pedido se confirma, el servicio de pagos avisa al servicio de inventario emitiendo un evento en la red. El inventario recibe el mensaje y actualiza sus estantes de forma independiente, asegurando que fallas momentáneas de red no impidan que el cliente complete su compra con éxito.

Consideraciones Finales

Diseñar microservicios a través de Event Storming y modelado táctico transforma la ingeniería de software de un ejercicio puramente técnico en un proceso colaborativo de descubrimiento de valor. Al alinear la estructura del código directamente con el vocabulario y los flujos del negocio, los equipos ganan velocidad, autonomía y claridad operativa. Los compromisos de los sistemas distribuídos dejan de ser un obstáculo insuperable y pasan a ser gestionados conscientemente a través de límites claros y comunicación asíncrona basada en hechos.

En última instancia, el éxito de una arquitectura basada en microservicios no depende de elegir el framework más reciente o la infraestructura más compleja, sino de la calidad del entendimiento humano sobre el problema que se está resolviendo. Invertir tiempo en el mapeo colaborativo y el modelado preciso evita un costoso trabajo repetido y asegura que el software evolucione al mismo ritmo en que la empresa crece en el mercado.