MidТеория3 min

C4 Model

Context, Container, Component, Code диаграммы с примерами и практикой Diagrams as Code

Что такое C4 Model

C4 Model -- иерархический подход к визуализации архитектуры программных систем, созданный Саймоном Брауном. Название C4 происходит от четырёх уровней: Context, Containers, Components, Code.

Аналогия с Google Maps

C4 работает как карта с zoom:

Level 1: System Context  =  Карта мира (Россия на глобусе)
Level 2: Container        =  Карта страны (регионы и города)
Level 3: Component        =  Карта города (улицы и районы)
Level 4: Code             =  Схема здания (комнаты и коридоры)

Каждый уровень отвечает на свой вопрос:
L1: Что это за система и кто её использует?
L2: Из каких технических блоков она состоит?
L3: Из каких модулей состоит каждый блок?
L4: Как устроен каждый модуль внутри?

Level 1: System Context Diagram

Самый высокий уровень. Показывает систему как чёрный ящик, её пользователей и внешние системы.

Аудитория

Все: разработчики, менеджеры, бизнес, стейкхолдеры.

Пример: E-commerce платформа

┌─────────────┐         ┌─────────────────────────┐
│  Customer   │         │     Admin User          │
│  [Person]   │         │     [Person]             │
└──────┬──────┘         └────────────┬────────────┘
       │                             │
       │ Просматривает товары,       │ Управляет каталогом,
       │ делает заказы               │ обрабатывает заказы
       │                             │
       ▼                             ▼
┌──────────────────────────────────────────────────┐
│                                                  │
│           E-COMMERCE PLATFORM                    │
│           [Software System]                      │
│                                                  │
│   Позволяет покупателям выбирать товары          │
│   и оформлять заказы онлайн                      │
│                                                  │
└────────────────────┬─────────────────────────────┘
                     │
        ┌────────────┼────────────┐
        │            │            │
        ▼            ▼            ▼
┌──────────┐  ┌──────────┐  ┌──────────┐
│ Payment  │  │  Email   │  │ Delivery │
│ Gateway  │  │ Service  │  │ Service  │
│[External]│  │[External]│  │[External]│
└──────────┘  └──────────┘  └──────────┘

Правила Level 1

Правило Описание
Система -- один прямоугольник Не показываем внутреннее устройство
Пользователи -- отдельные блоки Кто использует систему
Внешние системы С чем интегрируемся
Стрелки с описанием Что передаётся и зачем
Без технических деталей Никаких "REST", "PostgreSQL", "Kafka"

Level 2: Container Diagram

Zoom in внутрь системы. Показывает контейнеры: приложения, базы данных, файловые системы, очереди.

Что такое Container в C4

Container -- это НЕ Docker-контейнер!

Container в C4 = отдельно деплоящийся/запускаемый модуль:
- Web Application (SPA)
- API Application (backend)
- Database (PostgreSQL)
- Message Queue (RabbitMQ)
- Mobile App (iOS/Android)
- File Storage (S3)

Пример: E-commerce Platform (Level 2)

┌──────────┐                              ┌──────────┐
│ Customer │                              │  Admin   │
│ [Person] │                              │ [Person] │
└────┬─────┘                              └────┬─────┘
     │                                         │
     │ HTTPS                                   │ HTTPS
     ▼                                         ▼
┌──────────────────────────────────────────────────────┐
│                 E-COMMERCE PLATFORM                   │
│                                                      │
│  ┌──────────────┐          ┌──────────────────┐     │
│  │  Web App     │          │  Admin Panel     │     │
│  │  [Container: │  HTTPS/  │  [Container:     │     │
│  │   Vue.js SPA]│  JSON    │   Vue.js SPA]    │     │
│  └──────┬───────┘          └────────┬─────────┘     │
│         │                           │                │
│         └──────────┬────────────────┘                │
│                    ▼                                 │
│         ┌──────────────────┐                         │
│         │   API Gateway    │                         │
│         │   [Container:    │                         │
│         │    Nginx]        │                         │
│         └────────┬─────────┘                         │
│                  │                                   │
│      ┌───────────┼───────────┐                      │
│      ▼           ▼           ▼                      │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐                │
│ │ Order   │ │ Catalog │ │  User   │                │
│ │ Service │ │ Service │ │ Service │                │
│ │[Go]     │ │[Go]     │ │[Go]     │                │
│ └────┬────┘ └────┬────┘ └────┬────┘                │
│      │           │           │                      │
│      ▼           ▼           ▼                      │
│ ┌──────────────────────────────────┐                │
│ │        PostgreSQL                │                │
│ │        [Container: Database]     │                │
│ └──────────────────────────────────┘                │
│                                                      │
│ ┌──────────┐  ┌──────────┐                          │
│ │  Redis   │  │ RabbitMQ │                          │
│ │ [Cache]  │  │ [Queue]  │                          │
│ └──────────┘  └──────────┘                          │
└──────────────────────────────────────────────────────┘

Правила Level 2

Правило Описание
Каждый container -- отдельный процесс Может быть задеплоен отдельно
Указываем технологию Vue.js, Go, PostgreSQL
Стрелки с протоколом HTTPS, gRPC, AMQP, SQL
Границы системы видны Рамка вокруг контейнеров

Level 3: Component Diagram

Zoom in внутрь одного контейнера. Показывает основные компоненты: контроллеры, сервисы, репозитории.

Пример: Order Service (Level 3)

┌──────────────────────────────────────────────────┐
│              ORDER SERVICE [Container: Go]        │
│                                                  │
│  ┌─────────────────┐    ┌──────────────────┐    │
│  │  Order          │    │  Order           │    │
│  │  Controller     │───▶│  Service         │    │
│  │  [Component:    │    │  [Component:     │    │
│  │   HTTP Handler] │    │   Business Logic]│    │
│  └─────────────────┘    └────────┬─────────┘    │
│                                  │              │
│                    ┌─────────────┼──────────┐   │
│                    ▼             ▼          ▼   │
│  ┌──────────────┐ ┌──────────┐ ┌─────────────┐ │
│  │  Order       │ │ Payment  │ │ Notification│ │
│  │  Repository  │ │ Client   │ │ Publisher   │ │
│  │  [Component: │ │[Component│ │ [Component: │ │
│  │   DB Access] │ │ HTTP]    │ │  AMQP]      │ │
│  └──────┬───────┘ └────┬─────┘ └──────┬──────┘ │
│         │              │              │         │
└─────────┼──────────────┼──────────────┼─────────┘
          │              │              │
          ▼              ▼              ▼
    ┌──────────┐  ┌──────────┐  ┌──────────┐
    │PostgreSQL│  │ Payment  │  │ RabbitMQ │
    │          │  │ Gateway  │  │          │
    └──────────┘  └──────────┘  └──────────┘

Правила Level 3

Правило Описание
Только один контейнер Не смешивать компоненты разных контейнеров
Компоненты -- логические блоки Пакеты, модули, классы
Внешние зависимости за рамкой БД, другие сервисы
Не для каждого контейнера Только для ключевых

Level 4: Code Diagram

Zoom in внутрь компонента. Обычно UML Class или Package diagram.

Когда нужен Level 4

НУЖЕН:                              НЕ НУЖЕН:
- Сложная бизнес-логика             - CRUD-операции
- Критический компонент             - Простые сервисы
- Onboarding новых разработчиков    - Прототипы
- Код с неочевидной структурой      - Большинство случаев

Пример: Order Service (Level 4)

┌──────────────────────────────────────┐
│          <<interface>>               │
│          OrderRepository             │
│  ─────────────────────────           │
│  + FindByID(id UUID) Order           │
│  + Save(order Order) error           │
│  + FindByUser(userID UUID) []Order   │
└───────────────┬──────────────────────┘
                │ implements
                ▼
┌──────────────────────────────────────┐
│       PostgresOrderRepository        │
│  ─────────────────────────           │
│  - db *sql.DB                        │
│  ─────────────────────────           │
│  + FindByID(id UUID) Order           │
│  + Save(order Order) error           │
└──────────────────────────────────────┘

┌──────────────────────────────────────┐
│             Order                    │
│  ─────────────────────────           │
│  - id UUID                           │
│  - userID UUID                       │
│  - items []OrderItem                 │
│  - status OrderStatus                │
│  - total Money                       │
│  ─────────────────────────           │
│  + AddItem(item OrderItem)           │
│  + CalculateTotal() Money            │
│  + Submit() error                    │
│  + Cancel() error                    │
└──────────────────────────────────────┘

Diagrams as Code с Structurizr

Structurizr DSL -- инструмент для описания C4-моделей в текстовом формате.

Пример Structurizr DSL

workspace {
    model {
        customer = person "Customer" "A buyer"
        admin = person "Admin" "Manages catalog"

        ecommerce = softwareSystem "E-Commerce" {
            webapp = container "Web App" "Vue.js SPA" "JavaScript"
            api = container "API" "Backend API" "Go"
            db = container "Database" "Stores data" "PostgreSQL"

            webapp -> api "Makes API calls" "HTTPS/JSON"
            api -> db "Reads/writes" "SQL"
        }

        customer -> webapp "Browses and orders"
        admin -> webapp "Manages catalog"
    }

    views {
        systemContext ecommerce "Context" {
            include *
            autolayout lr
        }
        container ecommerce "Containers" {
            include *
            autolayout lr
        }
    }
}

Альтернативы

Инструмент Описание
Structurizr Официальный инструмент C4 (DSL + рендер)
PlantUML + C4 C4 через PlantUML-макросы
Mermaid C4 C4 в Markdown через Mermaid
D2 Универсальный Diagrams as Code
IcePanel Визуальный C4 с коллаборацией

Дополнительные диаграммы C4

System Landscape Diagram

Показывает ВСЕ системы организации (уровень выше L1):

┌──────────┐   ┌──────────┐   ┌──────────┐
│  CRM     │   │E-Commerce│   │Analytics │
│  System  │──▶│ Platform │──▶│ Platform │
└──────────┘   └──────────┘   └──────────┘
       │              │              │
       └──────────────┼──────────────┘
                      ▼
               ┌──────────┐
               │  Identity│
               │  Provider│
               └──────────┘

Deployment Diagram

Показывает КАК и ГДЕ развёрнута система:

┌─────────────────────────────┐
│     AWS Region: eu-west-1   │
│                             │
│  ┌───────────────────────┐  │
│  │  ECS Cluster          │  │
│  │  ┌─────┐ ┌─────┐     │  │
│  │  │ API │ │ API │     │  │
│  │  │ (x2)│ │ (x2)│     │  │
│  │  └─────┘ └─────┘     │  │
│  └───────────────────────┘  │
│                             │
│  ┌───────────────────────┐  │
│  │  RDS PostgreSQL       │  │
│  │  (Multi-AZ)           │  │
│  └───────────────────────┘  │
└─────────────────────────────┘

Итоги

Уровень Аудитория Детализация
L1: System Context Все Система + окружение
L2: Container Технические Приложения + БД + очереди
L3: Component Разработчики Модули внутри контейнера
L4: Code Разработчики Классы и интерфейсы

Главное правило: Рисуй Level 1 и 2 для каждого проекта. Level 3 -- для ключевых контейнеров. Level 4 -- почти никогда (код меняется слишком часто).

Проверь себя

Какая информация НЕ должна быть на Level 1 (System Context)?

Какому уровню C4 соответствует вопрос 'Из каких модулей состоит наш API-сервер?'

Какой инструмент является официальным для создания C4-диаграмм как код?

Почему Level 4 (Code) редко рисуют на практике?

Что означает 'Container' в терминологии C4 Model?