Cuando un sistema crece, dividirlo en microservicios bien delimitados deja de ser una opción y se vuelve una necesidad. Aquí entenderás cómo usar bounded context, context maps y patrones de relación entre equipos para diseñar arquitecturas de microservicios que escalen sin convertirse en una bola de lodo. Es contenido pensado para arquitectos, desarrolladores backend y líderes técnicos que trabajan con dominios complejos como aduanas, comercio internacional o sistemas bancarios.
¿Qué son los microservicios y cómo se comparan con un equipo especializado?
Piensa en los microservicios como técnicos especializados que apoyan a un nadador de alto rendimiento. Uno se ocupa de la técnica de nado, otro de la psicología del deporte y otro más de la nutrición. Cada uno aporta valor desde su especialidad, pero deben trabajar de forma armónica para que el atleta rinda al máximo.
Esa misma lógica aplica al software. En un caso real como el del Banco Interamericano de Desarrollo, puedes tener decenas de microservicios y la primera decisión crítica es dónde establecer las particiones y las fronteras entre ellos.
¿Qué es un microservicio? Es un componente de software autónomo que cumple una responsabilidad específica del dominio y se comunica con otros servicios mediante contratos definidos. Cada uno puede desplegarse y evolucionar de forma independiente.
¿Cómo delimitar fronteras con bounded context y context maps?
En una iteración inicial puedes tener un modelo de dominio simple. Pero a medida que aparecen más casos de uso y excepciones, ese modelo se complica hasta volverse casi ilegible. Imagina un subdominio que valida licencias, patentes y certificados de origen para importaciones en un sistema de aduanas: navegarlo entero es agotador y propenso a errores [01:30].
Ahí entra el bounded context, una técnica que delimita modelos del dominio. Una entidad puede existir en varios contextos, pero se especializa dentro de cada uno según las reglas y el lenguaje de ese contexto.
Los context maps llevan esa idea un paso más allá: te permiten visualizar y dividir el problema en subdominios especializados. En el caso de aduanas, una primera división natural separa exportaciones de importaciones. Al profundizar aparecen más capas:
Aduanas de exportación con sus entidades propias.
Exportación y sus tributos asociados.
Licencias, patentes y certificados como subdominio legal independiente.
Aduanas, tributos y licencias del lado de importaciones, usualmente más complejos por la dinámica del comercio internacional.
Esta segmentación no solo organiza el código, también ordena la conversación entre equipos.
¿Qué patrones existen para relacionar contextos?
Las relaciones entre context maps se pueden modelar con patrones reconocidos. Todo suele empezar como una big ball of mud, donde los contextos están mezclados y revueltos. A partir de ahí, aplicas patrones que no siempre son técnicos: muchos describen cómo se relacionan los equipos detrás de cada servicio.
Mutuamente dependientes: los equipos negocian constantemente cambios en los contratos de software.
Relación libre: cada contexto evoluciona por su camino, aunque sigan conectados.
Equipo principal y equipo cliente: uno lidera y el otro se adapta, lo que afecta velocidades de entrega y despliegues.
Definir bien esa dependencia es lo que hace productiva la relación entre equipos.
¿Cómo aplicar DRY en una arquitectura de microservicios?
El principio don't repeat yourself (DRY) busca evitar que repitas código por todo el sistema. Pero en microservicios, evitarlo al 100% es prácticamente imposible y a veces ni siquiera deseable.
Puedes repetir conscientemente modelos, lógicas e incluso servicios pequeños para mantener la independencia entre contextos. Lo que no debes hacer es llevarlo al extremo de convertir cada microservicio en un monolito independiente que contiene toda la lógica del sistema solo para evitar dependencias.
¿Cuándo es válido repetir código entre microservicios? Cuando duplicar evita acoplamientos fuertes entre contextos distintos y permite que cada equipo evolucione a su ritmo. La clave está en duplicar con intención, no por descuido.
La mejor estrategia es apoyarte en context maps y patrones de integración para mantener DRY donde tiene sentido, sin sacrificar la autonomía de cada servicio.
¿Qué retos técnicos aparecen al integrar microservicios?
Dividir el sistema trae beneficios, pero también complejidades nada triviales que debes diseñar desde el inicio:
Latencias de red entre servicios distribuidos.
Transacciones distribuidas que requieren patrones como saga o compensación.
Eventos y mensajería asíncrona entre sistemas, con sus garantías de entrega y orden.
Cada uno de estos retos tiene patrones específicos que puedes aplicar, pero ignorarlos al inicio del diseño suele costar caro más adelante.
¿Cómo organizar entornos de trabajo con varios equipos en paralelo?
Cuando tienes muchos equipos trabajando al mismo tiempo, no basta con cuidar el producto: también hay que cuidar los entornos de trabajo. Aquí entran herramientas modernas como los dev containers y los test containers, entornos controlados con herramientas estandarizadas disponibles para cada equipo.
Esto te permite:
Usar entornos compartidos en la nube en lugar de configuraciones locales frágiles.
Ejecutar tests de integración reales, no solo unitarios aislados.
Mantener seguridad y consistencia en el ciclo de vida del software.
La estandarización del entorno reduce fricción entre equipos y acelera la entrega sin sacrificar calidad.
¿Cómo estás dividiendo los contextos en tu arquitectura actual? Cuéntame en los comentarios qué patrón te ha funcionado mejor y dónde has visto aparecer la temida bola de lodo.
Y el repositorio de ddd-crew también tiene muy buenos recursos
Genial, no conocía ddd-crew
🧱 ¿Qué es un Bounded Context?
Un Bounded Context es una frontera semántica dentro del dominio, donde un modelo tiene significado claro y consistente. Dentro de esa frontera, los términos, reglas y estructuras son estables y bien definidos.
🔹 Ejemplo en comercio exterior:
En el contexto de Pagos Internacionales, “Liquidación” puede significar algo distinto que en Gestión Aduanera.
Cada contexto tiene su propio modelo, base de datos, API y equipo responsable.
🗺️ ¿Qué es un Context Map?
Un Context Map es una representación visual y semántica de cómo los Bounded Contexts se relacionan entre sí. Define los tipos de integración, dependencia y colaboración entre contextos.
🔹 Tipos de relaciones en un Context Map:
🧠 ¿Cómo usar Bounded Contexts para dividir microservicios?
Identifica subdominios funcionales
Usa Event Storming para descubrir eventos clave y agruparlos.
Define límites semánticos
¿Dónde cambia el significado de los términos? ¿Dónde se usan reglas distintas?
Asigna equipos por contexto
Cada equipo gestiona su modelo, base de datos y ciclo de vida.
Diseña APIs contractuales
Usa OpenAPI, GraphQL o gRPC para definir contratos claros entre contextos.
Documenta con Context Maps
Usa diagramas C4 + relaciones semánticas para visualizar la arquitectura.
📦 Artefactos recomendados
Context Map visual (Mermaid, Structurizr DSL)
ADR por contexto (decisiones locales con impacto global)
Checklist de integración (tipo de relación, contrato, resiliencia)
Con tu enfoque en gobernanza y documentación modular, podríamos armar juntos una plantilla de Context Map exportable, con ejemplos de relaciones, métricas de acoplamiento y decisiones arquitectónicas. También puedo ayudarte a estructurar un flujo de validación de contratos entre contextos usando AI y CI/CD. ¿Te gustaría avanzar en esa dirección?
🧠 ¿Cómo usar Bounded Contexts para dividir microservicios?
Identifica subdominios funcionales
Usa Event Storming para descubrir eventos clave y agruparlos.
Define límites semánticos
¿Dónde cambia el significado de los términos? ¿Dónde se usan reglas distintas?
Asigna equipos por contexto
Cada equipo gestiona su modelo, base de datos y ciclo de vida.
Diseña APIs contractuales
Usa OpenAPI, GraphQL o gRPC para definir contratos claros entre contextos.
Documenta con Context Maps
Usa diagramas C4 + relaciones semánticas para visualizar la arquitectura.
📦 Artefactos recomendados
Context Map visual (Mermaid, Structurizr DSL)
ADR por contexto (decisiones locales con impacto global)
Checklist de integración (tipo de relación, contrato, resiliencia)
🧩 Perspectiva aplicada: diseño de microservicios con patrones DDD
🔹 1. Inicio con Event Storming
En proyectos complejos (como comercio exterior o fintech), se comienza con sesiones de Event Storming para identificar eventos clave del negocio. Esto permite descubrir Bounded Contexts de forma natural, sin imponer una estructura técnica prematura.
Ejemplo: “Factura emitida”, “Contenedor inspeccionado”, “Pago confirmado” → se agrupan en contextos como Facturación, Logística, Pagos Internacionales.
🔹 2. Context Maps para definir relaciones
Una vez definidos los contextos, se documentan sus interacciones usando Context Maps. Esto ayuda a decidir si se necesita un Anticorruption Layer, una relación Conformist, o una Open Host Service.
En una implementación real, el sistema de pagos externos se integró como Conformist, mientras que el ERP interno usó un Anticorruption Layer para evitar contaminación semántica.
🔹 3. Microservicios alineados a Bounded Contexts
Cada contexto se convierte en un microservicio con su propio modelo, base de datos y ciclo de vida. Se definen contratos API claros (OpenAPI, gRPC) y se versionan junto con el código.
Se usó ADR para registrar decisiones como “usar PostgreSQL en logística por compatibilidad con GIS” o “exponer cotizaciones como GraphQL para flexibilidad”.
🔹 4. Evolución con Strangler Fig
En sistemas legacy, se aplicó el patrón Strangler Fig para migrar funcionalidades críticas sin interrumpir la operación. Se interceptaron llamadas en el gateway y se redirigieron gradualmente a nuevos servicios.
Esto permitió validar cada nuevo módulo con métricas como porcentaje de tráfico redirigido, errores por endpoint, y code churn.
🔹 5. Gobernanza distribuida con validación automática
Se integraron linters, pruebas contractuales (Pact), y validación de convenciones en CI/CD. Esto permitió que cada equipo tuviera autonomía sin perder coherencia global.
Se usó una matriz de gobernanza técnica con criterios como SRP, acoplamiento, frecuencia de cambio, y volatilidad de decisiones.
🧠 ¿Cómo mejorar la integración y evolución?
Documentación viva: Markdown + diagramas como código + ADRs versionados.
Flujos de validación con AI: para detectar violaciones arquitectónicas y sugerir refactorizaciones.
Dashboards ejecutivos: para mostrar métricas de evolución, estabilidad y rendimiento por contexto.
Plantillas compartidas: para decisiones, contratos, métricas y documentación técnica.
El uso de Bounded Context y Context Maps es fundamental para dividir sistemas complejos en microservicios bien definidos, permitiendo organizar el dominio en subáreas especializadas. Este enfoque facilita la escalabilidad, la claridad del modelo y la autonomía de los equipos, especialmente en entornos con múltiples actores y reglas de negocio.
El bounded context delimita el alcance de cada modelo, evitando ambigüedades, mientras que los context maps describen cómo interactúan estos contextos, incluyendo relaciones de dependencia, colaboración o independencia entre equipos. Estas decisiones impactan directamente en los contratos, despliegues y velocidad de desarrollo.
Aunque el principio Don’t Repeat Yourself sigue siendo relevante, en microservicios puede ser necesario duplicar ciertos elementos para reducir acoplamientos y favorecer la independencia. El reto está en equilibrar autonomía con coherencia del sistema.
Finalmente, el uso de entornos estandarizados y prácticas de integración y pruebas colaborativas resulta clave para mantener la calidad en arquitecturas distribuidas.