Модель C4
Модель C4: четыре уровня описания архитектуры — Context, Container, Component, Code. Нотации и примеры на маркетплейсе.
Все примеры в статье — на сквозном кейсе сайта: высоконагруженный маркетплейс. C4 — это удобный способ объяснить архитектуру системы разной аудитории, от бизнеса до разработчика, без потери деталей.
Что такое C4
C4 — это набор диаграмм, описывающих систему на разных уровнях детализации. Уровни вложены, как у карты: сначала видно страну, потом город, потом улицу.
| Уровень | Что показывает | Аудитория |
|---|---|---|
| C1 — Context | Систему в окружении: пользователи + внешние системы | Бизнес, менеджеры, новые сотрудники |
| C2 — Container | Из каких контейнеров (сервисов, БД, очередей) состоит система | Архитекторы, разработчики |
| C3 — Component | Внутренние компоненты одного контейнера | Разработчики данного сервиса |
| C4 — Code | Детализация на уровне кода (классы, интерфейсы) | Опционально, обычно генерируется из кода |
Главная идея: одинаковые обозначения (нотации) на всех уровнях. Двигаемся от общего к частному, не теряя контекст.
Почему это удобно для system design
- Единый стандарт диаграмм — на собеседовании или код-ревью не приходится объяснять, что значит каждая стрелочка.
- Простая эволюция: сначала Context → потом Container → если нужно, Component.
- Проще обсуждать границы ответственности и интеграции — каждая диаграмма отвечает на свой набор вопросов.
Какой уровень нужен в system design
Обязательные:
- Context (C1)
- Container (C2)
Желательно:
- Component (C3) — если внутри сервиса сложная логика и нужно показать структуру
Опционально:
- Code (C4) — обычно избыточно. Лучше документировать код самим кодом.
Уровень Context (C1)
Диаграмма контекста подходит для бизнес-пользователей, которым не нужно погружаться в технические нюансы.
Цели диаграммы — ответить на вопросы:
- Какие пользователи используют документируемую систему?
- С какими системами взаимодействует документируемая система?
- Для чего нужны эти взаимодействия?
Нотации
| Элемент | Что обозначает |
|---|---|
| Person | Пользователь документируемой системы |
| System | Документируемая система — высший уровень абстракции, описывающий нечто, что приносит пользу пользователям |
| System_Ext | Внешняя система, с которой взаимодействует документируемая система |
| Стрелка | Отношение между элементами. Направлена от вызывающего к вызываемому |
Пример: маркетплейс
Эта диаграмма уровня Context: видно систему как чёрный ящик, её пользователей и внешние системы. Технологий не видно — это намеренно.
Уровень Container (C2)
Диаграмма контейнеров отвечает на технические вопросы: из чего состоит система и по каким каналам контейнеры общаются.
Цели диаграммы:
- Какие технологии использует система?
- Из каких контейнеров (сервисов, баз данных, очередей) состоит система?
- Как контейнеры взаимодействуют между собой?
- Как контейнеры взаимодействуют с внешними системами?
- Как пользователи взаимодействуют с системой?
Рекомендации по оформлению
- Каждый контейнер должен иметь технологию и зону ответственности (например: «Order Service: Spring Boot, обработка заказов»).
- Связи подписываются: что делает связь + протокол (например: «получает курс валют, REST/JSON»).
- Внешние системы всегда обозначаются
System_Ext. - Очереди и БД лучше отражать отдельно (
ContainerQueue,ContainerDb).
Нотации
| Элемент | Что обозначает |
|---|---|
| Container | Самостоятельная часть системы, например «Mobile App», «Order Service» |
| ContainerDb | Хранилище данных |
| ContainerQueue | Брокер или очередь сообщений |
| System_Boundary | Группа контейнеров, из которых состоит документируемая система |
| Сплошная стрелка | Синхронное взаимодействие |
| Пунктирная стрелка | Асинхронное взаимодействие |
Также используются все нотации диаграммы Context.
Пример: маркетплейс
На этой диаграмме сразу видно:
- что — Customer API, Catalog/Order/Payment/Inventory сервисы, PostgreSQL, Elasticsearch, Kafka.
- на чём — все сервисы на Spring Boot, БД per-service.
- как общаются — синхронные REST-вызовы (сплошные стрелки), асинхронные события через Kafka (пунктирные).
- с чем снаружи — внешний платёжный шлюз и логистика.
Когда использовать какой уровень
- Объясняешь бизнесу или новичку, что делает система → C1 (Context).
- Проектируешь архитектуру, обсуждаешь её с командой → C2 (Container).
- Документируешь сложный сервис изнутри → C3 (Component) — обычно в README этого сервиса.
- Показываешь конкретные классы → лучше код-ревью или ссылка на код.
Ссылки
- Подробное описание модели — официальный сайт автора Simon Brown: c4model.com.
- Структурные паттерны — паттерны, которые отражаются на C2-диаграмме.
- Кейс: маркетплейс — там же C1/C2 для нашей системы.