Saltar al contenido

Cómo Comunicar Decisiones de Arquitectura

Un diagrama muestra qué es el sistema; un ADR explica por qué es así.

12 min. de lectura

Una arquitectura que solo existe en la cabeza de una persona es difícil de revisar, mantener y evolucionar. La comunicación arquitectónica tiene dos objetivos que no son exactamente lo mismo: explicar el sistema y explicar las decisiones.

Un diagrama puede mostrar Payment Service → Kafka → Orders, pero no explicar:

¿Por qué elegimos Kafka? ¿Qué alternativas consideramos? ¿Qué trade-off aceptamos?

Para eso necesitamos combinar diagramas, documentos de decisión y contexto escrito.

Registros de Decisiones de Arquitectura (ADR)

Un registro de decisión de arquitectura (ADR, por sus siglas en inglés) es una técnica para registrar una única decisión relevante, su contexto y sus consecuencias.

Martin Fowler destaca precisamente que un ADR debería ser breve y centrarse en una decisión concreta, con el contexto, la decisión y sus implicancias. También señala que escribir la decisión ayuda a hacer explícitas las diferencias de criterio y a mejorar el razonamiento del equipo.

El término ADR fue acuñado por Michael Nygard en 2011.

Un template práctico

No es necesario adoptar un formato rígido. Un template útil puede ser:

# ADR-001: Usar eventos asíncronos para notificaciones de pago

## Estado
Aceptada

## Contexto
Los proveedores de pago envían notificaciones sobre cambios de estado.
El sistema necesita avisar a Orders, Analytics y Notifications
sin acoplar el request del proveedor a cada consumidor posterior.

## Decisión
Los cambios de estado de un pago se publicarán como eventos de dominio
a través de Kafka.

## Alternativas consideradas
1. Llamadas síncronas
2. Procesamiento basado en colas
3. Kafka

## Trade-offs
Ventajas:
- Múltiples consumidores
- Desacoplamiento temporal
- Posibilidad de replay
- Alto throughput

Costos:
- Consistencia eventual
- Infraestructura adicional
- Consumidores idempotentes
- Evolución del schema de eventos

## Consecuencias
Orders puede observar los cambios de pago con un pequeño delay.
Los consumidores deben ser idempotentes.
Los eventos deben tener schemas versionados.

## Revisar cuando
Reconsiderar esta decisión si:
- el volumen de eventos cambia de forma significativa;
- la complejidad operativa se vuelve desproporcionada;
- los consumidores ya no necesitan procesamiento independiente.

El objetivo es que una persona que no participó de la discusión pueda entender qué se decidió, por qué, qué alternativas se consideraron, qué trade-offs se aceptaron y qué consecuencias trajo.

Una decisión no es una implementación

Un ADR debería documentar “usar eventos asíncronos” y no necesariamente “crear el topic de Kafka payment.events con 3 particiones y replication factor 3…”. Lo segundo corresponde más bien a un documento de despliegue o de configuración. La decisión arquitectónica debe conservarse en un nivel que siga siendo útil aunque algunos detalles de implementación cambien.

Diagramas de Arquitectura

Los diagramas cumplen otra función:

Hacer visible la estructura del sistema.

No todos los diagramas sirven para responder las mismas preguntas. Una taxonomía práctica: contexto, componentes, despliegue, runtime/secuencia y datos/dominio.

UML

UML 2.5.1 define un lenguaje estandarizado para modelar software y sistemas. La especificación oficial pertenece al Object Management Group (OMG). No todos los diagramas UML son igualmente útiles para arquitectura; los más relevantes son:

Diagrama de Casos de Uso

Muestra qué actores interactúan con el sistema y qué capacidades les ofrece. La notación tiene cuatro piezas: los actores como monigotes fuera del sistema, los casos de uso como elipses adentro, un rectángulo punteado que marca el límite del sistema, y líneas de asociación sin punta entre actor y caso de uso. Las dependencias entre casos de uso se dibujan punteadas con el estereotipo «include» o «extend».

PAYMENT SYSTEMCustomerPaymentProviderAuthorize PaymentRefund PaymentProcess WebhookVerify Card«include»
Diagrama de casos de uso UML del sistema de Payments: dos actores, tres casos de uso dentro del límite del sistema, y una dependencia «include».

Sirve para acordar alcance, capacidades y actores. No sirve para explicar infraestructura ni orden temporal: un use case diagram no dice en qué orden pasan las cosas.

Diagrama de Componentes

Representa unidades reemplazables de software y, sobre todo, los contratos por los que se conectan. Esa es la parte que distingue un component diagram de un dibujo de cajas y flechas: cada componente declara las interfaces que provee (el círculo, la “ball”) y las que requiere (el semicírculo, el “socket”), y un conector de ensamblaje une una con otra.

«component»CheckoutPaymentApi«component»PaymentsPaymentProviderApi«component»Provider SDKEl conector ensambla la interfaz requerida (socket) con la provista (ball).
Diagrama de componentes UML: Checkout requiere la interfaz PaymentApi que Payments provee, y Payments requiere PaymentProviderApi. Los conectores son ball-and-socket.

Leído así, el diagrama dice algo que una flecha suelta no dice: Checkout no depende de Payments, depende de PaymentApi. Cambiar la implementación detrás de esa interfaz no toca a Checkout. Es la misma idea que el Principio de Inversión de Dependencias, dibujada.

Diagrama de Secuencia

Muestra el orden temporal de las interacciones: participantes arriba, líneas de vida hacia abajo, mensajes síncronos con punta llena y respuestas punteadas. Es el único de estos diagramas que responde “¿en qué orden?”.

Diagrama de secuencia UML de una autorización de pago, con el camino alternativo cuando el provider no responde a tiempo.

Es el diagrama que mejor expone los escenarios de fallo, los reintentos y los timeouts — justamente lo que se pierde cuando un flujo distribuido se dibuja como una cadena de flechas.

Diagrama de Despliegue

Muestra dónde se ejecuta cada cosa. Los nodos son cajas 3D con un estereotipo que dice de qué tipo son («device» para hardware o infraestructura, «executionEnvironment» para un runtime que aloja software), los artifacts desplegados van adentro del nodo, y las líneas entre nodos son caminos de comunicación, idealmente etiquetados con el protocolo.

«device»Load Balancer«executionEnvironment»AZ A · App Server«artifact» payments.jar«executionEnvironment»AZ B · App Server«artifact» payments.jar«device»PostgreSQL (primary)HTTPSHTTPSTCP 5432TCP 5432
Diagrama de despliegue UML: dos availability zones, cada una con un execution environment que aloja el artifact payments.jar, y una base de datos compartida.

Es el diagrama correcto para discutir disponibilidad, redundancia, regiones y AZs, porque hace visible qué se cae si se cae un nodo.

Diagrama de Actividades

Representa un flujo de trabajo con sus bifurcaciones. La notación pide un nodo inicial (círculo relleno), acciones como rectángulos redondeados, un decision node como rombo con las guardas entre corchetes, un merge node que vuelve a juntar las ramas, y un nodo final (círculo con anillo).

Diagrama de actividades del flujo de autorización de un pago, con nodo inicial, decision node, merge node y nodo final.

Útil para procesos de negocio y lógica con ramas. Cuando el flujo cruza varios servicios, un sequence diagram suele comunicar mejor, porque muestra quién le habla a quién.

Diagrama de Clases

Más útil para diseño detallado que para arquitectura de sistemas, pero es el diagrama natural para Tactical DDD: aggregates, entities y value objects con sus atributos, operaciones y multiplicidades.

Diagrama de clases UML del aggregate Payment, con su value object Money y sus intentos de autorización.

Es el mismo tipo de diagrama que usa el tema de patrones de diseño para mostrar la estructura de cada patrón.

UML no es la única alternativa

Para arquitectura de sistemas modernos también es muy útil el Modelo C4, de Simon Brown. C4 propone cuatro niveles de zoom sobre el mismo sistema: Contexto, Contenedor, Componente y Código.

La diferencia con un árbol de cajas es importante y se confunde seguido: en C4 un nivel no “apunta” a sus hijos. Cada diagrama muestra las piezas de ese nivel de abstracción y las relaciones entre ellas, siempre etiquetadas y con la tecnología anotada. Bajar un nivel no es seguir una flecha, es abrir una de las cajas.

Nivel 1 — Contexto. Quién usa el sistema y con qué sistemas externos habla. Una sola caja para todo el sistema propio.

Diagrama de contexto C4: el cliente usa la plataforma de e-commerce, que se integra con el proveedor de pagos y el de email.

Nivel 2 — Contenedor. Qué unidades desplegables componen el sistema, con qué tecnología, y cómo se comunican entre sí. El límite del sistema es explícito.

Diagrama de contenedores C4: dentro del límite del sistema, la SPA habla con la API, que usa el módulo de Payments, PostgreSQL y Kafka.

Nivel 3 — Componente. Qué hay adentro de un container. Acá se abre Payments Module, no la plataforma entera.

Diagrama de componentes C4 del módulo de Payments: controller, servicio de dominio, adapter del proveedor y repositorio.

El nivel 4, Código, casi nunca vale la pena dibujarlo a mano: si hace falta, un class diagram generado a partir del código envejece mejor.

C4 es útil justamente porque evita el diagrama que mezcla negocio, servicios, clases e infraestructura en una sola imagen ilegible. Cada nivel tiene una audiencia distinta: Contexto para negocio, Contenedor para el equipo entero, Componente para quien va a tocar ese módulo.

Herramientas

Los diagramas pueden producirse con Mermaid, PlantUML, Structurizr, diagrams.net, Lucidchart, Miro o Excalidraw. Para un blog técnico, Mermaid y PlantUML tienen una ventaja importante: el diagrama puede vivir como código junto al contenido.

Qué comunicar y con qué diagrama

PreguntaDiagrama recomendado
¿Cuál es el sistema y quién interactúa con él?Contexto C4
¿Qué servicios o módulos existen?Componentes / Contenedores C4
¿Cómo se ejecuta un flujo?Secuencia
¿Dónde corre cada componente?Despliegue
¿Cómo es el modelo de dominio?Clases
¿Cómo funciona un workflow?Actividades
¿Qué decisión tomamos?ADR

No existe un “diagrama de arquitectura definitivo”. Cada diagrama debe responder una pregunta concreta.

Un ejemplo completo de comunicación

Supongamos que Payments es un monolito modular sobre PostgreSQL, que publica eventos en Kafka y se integra de forma síncrona con proveedores externos. Documentarlo bien no significa dibujarlo cinco veces: significa elegir cinco artefactos que respondan cinco preguntas distintas.

PreguntaArtefacto
¿Quién usa el sistema y con quién habla?Diagrama de contexto (C4 nivel 1)
¿De qué piezas desplegables está hecho?Diagrama de contenedores (C4 nivel 2)
¿Qué pasa cuando el proveedor no responde?Diagrama de secuencia con camino alternativo
¿Qué se cae si se cae una AZ?Diagrama de despliegue
¿Por qué Kafka y no llamadas síncronas?ADR

Ninguno de los cuatro diagramas reemplaza al ADR, y el ADR no reemplaza a ninguno de los cuatro. Los diagramas muestran qué es el sistema; el ADR explica por qué es así. Es la distinción con la que abre este artículo, y es la que más seguido se pierde: equipos con diagramas impecables y sin una sola línea escrita sobre las alternativas que descartaron.

Cómo decidir qué documentar

No toda decisión técnica necesita un documento de arquitectura. Documentar indiscriminadamente cada decisión genera ruido y hace más difícil encontrar aquello que realmente explica la evolución del sistema.

Una decisión merece ser documentada cuando tiene un impacto significativo sobre la estructura, el comportamiento o la evolución del sistema, especialmente cuando existen varias alternativas razonables y modificarla posteriormente tendría un costo elevado.

Te sirvió, compartilo

// ¿te sirvió?
// compartilo