El diagrama de contenedores C4
El nivel 2 del modelo C4, dibujado de principio a fin, y el único nivel cuyo nombre causa más confusión que el diagrama mismo.
6 min de lecturaC4 model2 de 3
La respuesta corta
- Un contenedor es cualquier cosa desplegable o ejecutable por separado: una aplicación, una API, una base de datos, un broker. No un contenedor Docker.
- Cada caja lleva su tecnología y cada línea su protocolo. Un diagrama de contenedores sin eso es un boceto de cajas y flechas.
- Dibuja la flecha en la dirección de la llamada, no en la de los datos. La respuesta va implícita y dibujarla duplica las líneas para nada.
- Los sistemas externos siguen en el diagrama pero fuera de la frontera, en gris: explican los bordes sin fingir que los controlas.
01Un sistema, abierto#
Un diagrama de contenedores toma la única caja del diagrama de contexto del sistema y la abre. Todo lo de dentro es algo que tiene que estar en marcha; todo lo de fuera sigue siendo contexto.
Léelo como una serie de frases: el cliente navega por la aplicación de una sola página; la aplicación llama a la Storefront API por HTTPS; la API escribe pedidos en PostgreSQL y publica en RabbitMQ; el worker consume de RabbitMQ y escribe en la misma base de datos. Esa última frase es justo lo que un diagrama de contenedores existe para hacer visible: dos contenedores escribiendo en una misma base son un acoplamiento que ningún catálogo de servicios muestra.
02La tecnología en la caja, el protocolo en la línea#
Estas dos etiquetas son lo que separa un diagrama de contenedores de un boceto. Sin la tecnología, una caja llamada "Storefront API" podría ser una Lambda, un monolito en Rails o un procedimiento almacenado. Sin el protocolo, una línea entre dos cajas podría ser una llamada síncrona en la ruta de la petición o un proceso por lotes nocturno, que son hechos opuestos para cualquiera que razone sobre fallos.
Dibuja la flecha en la dirección de la llamada, no en la de los datos. Una lectura sigue siendo una llamada del lector al almacén, y dibujar la respuesta como una segunda flecha duplica el número de líneas sin aportar nada: la respuesta va implícita en la petición.
03Los cuatro que lo vuelven inútil#
Dejar fuera los almacenes de datos. Un diagrama de servicios sin bases de datos oculta justo el acoplamiento que causa incidentes. Si dos contenedores escriben en la misma tabla, eso tiene que estar en la imagen.
Mezclar niveles. Un diagrama de contenedores con un contenedor abierto hasta sus clases internas son dos diagramas mal superpuestos. Ábrelo mejor en un diagrama de componentes, donde el público espera esa profundidad.
Dibujar la infraestructura. Balanceadores, sidecars y nodos de Kubernetes pertenecen a un diagrama de despliegue. Un diagrama de contenedores trata de qué es el software, no de dónde se ejecuta.
Quitar en silencio los sistemas externos. El proveedor de pagos no es tuyo y no puede omitirse por eso: de ahí vienen tu latencia y la mitad de tus modos de fallo. Consérvalo, márcalo como externo y para ahí.
En una línea cada uno
- 01Un contenedor es desplegable o ejecutable por separado: aplicación, API, base de datos, broker, tarea.
- 02Etiqueta cada caja con su tecnología y cada línea con su protocolo, o el diagrama no dice nada.
- 03Las flechas siguen a las llamadas, no a los datos. La respuesta va implícita.
- 04Almacenes de datos y sistemas externos se quedan en el diagrama; la infraestructura se va a uno de despliegue.
04Preguntas frecuentes#
¿Qué cuenta como contenedor en C4?
Cualquier cosa que tenga que estar ejecutándose para que el sistema funcione y que pueda desplegarse o arrancarse por separado: una aplicación web, una SPA, una app móvil, una API, una base de datos, un broker de mensajes, un trabajo programado. El criterio es la desplegabilidad, no el número de procesos ni la tecnología.
¿Un contenedor Docker es un contenedor C4?
No necesariamente. Los nombres coinciden y significan cosas distintas. Tres procesos en una imagen son tres contenedores C4 si el equipo razona sobre ellos por separado; un servicio corriendo en cuarenta réplicas es un solo contenedor C4. Ignora el empaquetado y pregunta qué se despliega por separado.
¿Cada microservicio debe ser un contenedor?
Sí, y esa es la razón honesta de que los diagramas de contenedores crezcan. Si cuarenta servicios hacen el diagrama ilegible, eso es información sobre la arquitectura y no sobre la notación: agrúpalos por contexto delimitado y dibuja los grupos, o haz un diagrama por contexto.
¿Dónde van las colas y las bases de datos?
En el diagrama, como contenedores, con su tecnología etiquetada. Dejar fuera la base de datos es la forma más común de que un diagrama de contenedores resulte engañoso: oculta el acoplamiento entre los dos servicios que ambos escriben en ella.
En esta serie
- 01¿Qué es C4?
- 02Diagrama de contenedores
- 03C4 vs UML
Lecturas relacionadas
Fundamentos
Práctica del modelado
Diagramas de estructura
Práctica del modelado