Das C4-Containerdiagramm
Ebene 2 des C4-Modells, durchgezeichnet - und die eine Ebene, deren Name mehr Verwirrung stiftet als das Diagramm selbst je könnte.
6 Min. LesezeitC4 model2 von 3
Die kurze Antwort
- Ein Container ist alles separat Deploybare oder Lauffähige: eine Anwendung, eine API, eine Datenbank, ein Broker. Kein Docker-Container.
- Jeder Kasten bekommt seine Technologie und jede Linie ihr Protokoll. Ein Containerdiagramm ohne beides ist eine Kasten-und-Pfeil-Skizze.
- Zeichnen Sie den Pfeil in Richtung des Aufrufs, nicht der Daten. Die Antwort ist impliziert, und sie zu zeichnen verdoppelt die Linien für nichts.
- Fremdsysteme bleiben auf dem Diagramm, aber außerhalb der Grenze und ausgegraut - sie erklären die Ränder, ohne so zu tun, als kontrollierten Sie sie.
01Ein System, geöffnet#
Ein Containerdiagramm nimmt den einzelnen Kasten aus dem Systemkontextdiagramm und öffnet ihn. Alles darin ist etwas, das laufen muss; alles außerhalb bleibt Kontext.
Lesen Sie es als Satzfolge: der Kunde benutzt die Single-Page-Anwendung; die Anwendung ruft die Storefront-API über HTTPS auf; die API schreibt Bestellungen nach PostgreSQL und publiziert nach RabbitMQ; der Worker konsumiert aus RabbitMQ und schreibt in dieselbe Datenbank. Genau dieser letzte Satz ist der Grund, warum es Containerdiagramme gibt - zwei Container, die in eine Datenbank schreiben, sind eine Kopplung, die kein Servicekatalog zeigt.
02Technologie am Kasten, Protokoll an der Linie#
Diese beiden Beschriftungen trennen ein Containerdiagramm von einer Skizze. Ohne die Technologie könnte ein Kasten namens "Storefront API" eine Lambda, ein Rails-Monolith oder eine gespeicherte Prozedur sein. Ohne das Protokoll könnte eine Linie zwischen zwei Kästen ein synchroner Aufruf im Anfragepfad oder ein nächtlicher Batchlauf sein - für jeden, der über Ausfälle nachdenkt, sind das gegenteilige Tatsachen.
Zeichnen Sie den Pfeil in Richtung des Aufrufs, nicht in Richtung der Daten. Ein Lesen ist immer noch ein Aufruf vom Leser an den Speicher, und die Antwort als zweiten Pfeil zu zeichnen verdoppelt die Linienzahl, ohne etwas hinzuzufügen - die Antwort ist von der Anfrage impliziert.
03Die vier, die es nutzlos machen#
Die Datenspeicher weglassen. Ein Diagramm aus Diensten ohne Datenbanken verbirgt genau die Kopplung, die Vorfälle verursacht. Wenn zwei Container dieselbe Tabelle schreiben, muss das auf dem Bild sein.
Ebenen mischen. Ein Containerdiagramm, in dem ein Container in seine internen Klassen geöffnet ist, sind zwei schlecht übereinandergelegte Diagramme. Öffnen Sie ihn stattdessen auf einem Komponentendiagramm, wo das Publikum diese Tiefe erwartet.
Infrastruktur zeichnen. Load Balancer, Sidecars und Kubernetes-Knoten gehören auf ein Verteilungsdiagramm. Ein Containerdiagramm handelt davon, was die Software ist, nicht davon, wo sie läuft.
Externe Systeme stillschweigend weglassen. Der Zahlungsanbieter gehört Ihnen nicht und kann genau deshalb nicht weggelassen werden - von dort kommen Ihre Latenz und die Hälfte Ihrer Fehlerfälle. Behalten Sie ihn, markieren Sie ihn als extern, und hören Sie dort auf.
In je einer Zeile
- 01Ein Container ist separat deploybar oder lauffähig - Anwendung, API, Datenbank, Broker, Job.
- 02Beschriften Sie jeden Kasten mit seiner Technologie und jede Linie mit ihrem Protokoll, sonst sagt das Diagramm nichts.
- 03Pfeile folgen Aufrufen, nicht Daten. Die Antwort ist impliziert.
- 04Datenspeicher und externe Systeme bleiben auf dem Diagramm; Infrastruktur wandert auf ein Verteilungsdiagramm.
04Häufige Fragen#
Was zählt in C4 als Container?
Alles, was laufen muss, damit das System funktioniert, und was sich separat deployen oder starten lässt: eine Webanwendung, eine Single-Page-App, eine mobile App, eine API, eine Datenbank, ein Message Broker, ein geplanter Job. Das Kriterium ist Deploybarkeit, nicht Prozessanzahl und nicht Technologie.
Ist ein Docker-Container ein C4-Container?
Nicht zwangsläufig. Die Namen kollidieren und meinen Verschiedenes. Drei Prozesse in einem Image sind drei C4-Container, wenn das Team sie getrennt betrachtet; ein Dienst auf vierzig Replikaten ist ein C4-Container. Ignorieren Sie die Verpackung und fragen Sie, was separat deploybar ist.
Sollte jeder Microservice ein Container sein?
Ja, und das ist der ehrliche Grund, warum Containerdiagramme groß werden. Wenn vierzig Dienste das Diagramm unlesbar machen, ist das eine Aussage über die Architektur und nicht über die Notation - gruppieren Sie nach Bounded Contexts und zeichnen Sie die Gruppen, oder zeichnen Sie ein Diagramm je Kontext.
Wohin gehören Queues und Datenbanken?
Auf das Diagramm, als Container, mit beschrifteter Technologie. Die Datenbank wegzulassen ist der häufigste Weg, ein Containerdiagramm irreführend zu machen: es verbirgt die Kopplung zwischen den beiden Diensten, die beide hineinschreiben.
In dieser Reihe
- 01Was ist C4?
- 02Containerdiagramm
- 03C4 vs. UML
Passend dazu
Grundlagen
Modellierungspraxis
Strukturdiagramme
Modellierungspraxis