Модель C4

Модель C4: четыре уровня описания архитектуры — Context, Container, Component, Code. Нотации и примеры на маркетплейсе.

Модель C4

Все примеры в статье — на сквозном кейсе сайта: высоконагруженный маркетплейс. 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Внешняя система, с которой взаимодействует документируемая система
СтрелкаОтношение между элементами. Направлена от вызывающего к вызываемому

Пример: маркетплейс

diagram

Эта диаграмма уровня Context: видно систему как чёрный ящик, её пользователей и внешние системы. Технологий не видно — это намеренно.

Уровень Container (C2)

Диаграмма контейнеров отвечает на технические вопросы: из чего состоит система и по каким каналам контейнеры общаются.

Цели диаграммы:

  • Какие технологии использует система?
  • Из каких контейнеров (сервисов, баз данных, очередей) состоит система?
  • Как контейнеры взаимодействуют между собой?
  • Как контейнеры взаимодействуют с внешними системами?
  • Как пользователи взаимодействуют с системой?

Рекомендации по оформлению

  • Каждый контейнер должен иметь технологию и зону ответственности (например: «Order Service: Spring Boot, обработка заказов»).
  • Связи подписываются: что делает связь + протокол (например: «получает курс валют, REST/JSON»).
  • Внешние системы всегда обозначаются System_Ext.
  • Очереди и БД лучше отражать отдельно (ContainerQueue, ContainerDb).

Нотации

ЭлементЧто обозначает
ContainerСамостоятельная часть системы, например «Mobile App», «Order Service»
ContainerDbХранилище данных
ContainerQueueБрокер или очередь сообщений
System_BoundaryГруппа контейнеров, из которых состоит документируемая система
Сплошная стрелкаСинхронное взаимодействие
Пунктирная стрелкаАсинхронное взаимодействие

Также используются все нотации диаграммы Context.

Пример: маркетплейс

diagram

На этой диаграмме сразу видно:

  • что — Customer API, Catalog/Order/Payment/Inventory сервисы, PostgreSQL, Elasticsearch, Kafka.
  • на чём — все сервисы на Spring Boot, БД per-service.
  • как общаются — синхронные REST-вызовы (сплошные стрелки), асинхронные события через Kafka (пунктирные).
  • с чем снаружи — внешний платёжный шлюз и логистика.

Когда использовать какой уровень

  • Объясняешь бизнесу или новичку, что делает система → C1 (Context).
  • Проектируешь архитектуру, обсуждаешь её с командой → C2 (Container).
  • Документируешь сложный сервис изнутри → C3 (Component) — обычно в README этого сервиса.
  • Показываешь конкретные классы → лучше код-ревью или ссылка на код.

Ссылки