C4 Model

Визуализация архитектуры на четырёх уровнях

1 апреля 2024

C4 Model - это способ визуализации архитектуры программных систем через четыре уровня абстракции: Context, Containers, Components, Code. Как карты Google: от страны до улицы.

Автор модели - Simon Brown. Официальный сайт: c4model.com

Зачем нужен C4

Проблема архитектурных диаграмм - они либо слишком абстрактны (бессмысленные квадратики), либо слишком детальны (UML-простыни). C4 предлагает золотую середину: четыре уровня детализации для разных аудиторий.

Level 1: System Context

Показывает систему как чёрный ящик в окружении пользователей и внешних систем. Это bird's eye view - вид с высоты птичьего полёта.

Scope Одна software system
Primary elements Ваша система (в центре)
Supporting elements Пользователи (роли, персоны) и внешние системы
Аудитория Все: технические и нетехнические люди

Пример: B2B SaaS платформа

┌─────────────────────────────────────────────────────────────────┐
│                        USERS (Personas)                         │
├─────────────┬─────────────┬─────────────┬─────────────┬─────────┤
│ Employee    │ Client      │ Admin       │ Support     │ SRE     │
│ (firm user) │ (end user)  │ (system)    │ (L2 help)   │ (ops)   │
└──────┬──────┴──────┬──────┴──────┬──────┴──────┬──────┴────┬────┘
       │             │             │             │           │
       ▼             ▼             ▼             ▼           ▼
┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│                    ┌───────────────────┐                        │
│                    │   THE PLATFORM    │                        │
│                    │   (Our System)    │                        │
│                    └─────────┬─────────┘                        │
│                              │                                  │
└──────────────────────────────┼──────────────────────────────────┘
                               │
       ┌───────────────────────┼───────────────────────┐
       ▼                       ▼                       ▼
┌─────────────┐         ┌─────────────┐         ┌─────────────┐
│  Payment    │         │ E-Signature │         │   Email     │
│  Provider   │         │   Service   │         │ Integration │
└─────────────┘         └─────────────┘         └─────────────┘
           EXTERNAL SYSTEMS (Third-Party Services)
Рекомендация: создавайте для каждой системы. Это точка входа для понимания контекста.

Что НЕ включать: технологии, протоколы, низкоуровневые детали. Диаграмма должна быть понятна product manager или CEO.

Level 2: Containers

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

Container ≠ Docker container. В C4 "container" - это любой отдельно запускаемый/деплоимый компонент: процесс, который выполняет код или хранит данные.
Scope Одна software system
Primary elements Containers внутри системы
Supporting elements Пользователи и внешние системы, связанные с containers
Аудитория Технические люди: архитекторы, разработчики, DevOps

Показывает:

Пример: Backend платформы

CLIENT APPS:  [React SPA] [Mobile Employee] [Mobile Client] [Desktop] [Admin]
                   |              |               |             |         |
                   +-------+------+-------+-------+-------------+---------+
                           |              |
                           v  HTTPS API   v
              +--------------------------------------------------+
              |                    BACKEND                       |
              |                                                  |
              |  +----------+  +------------+  +-----------+     |
              |  | Web App  |  | Background |  | Scheduler |     |
              |  | (Rails)  |  | Jobs       |  | (Cron)    |     |
              |  +----+-----+  +-----+------+  +-----+-----+     |
              |       |              |              |            |
              |       +--------------+--------------+            |
              |                      |                           |
              |                      v                           |
              |  +----------------------------------------------+|
              |  |               DATABASES                      ||
              |  | [PostgreSQL] [Redis] [OpenSearch] [S3]       ||
              |  +----------------------------------------------+|
              +--------------------------------------------------+
                           |         |         |
                           v gRPC    v gRPC    v gRPC
                    +---------+ +---------+ +-----------+
                    |Payments | |   OCR   | |Marketplace|
                    | Service | | Service | |  Service  |
                    +---------+ +---------+ +-----------+

Что НЕ включать: кластеризацию, load balancers, репликацию - это для Deployment diagram.

Level 3: Components

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

Scope Один container
Primary elements Components внутри container
Supporting elements Другие containers и внешние системы
Аудитория Архитекторы и разработчики

Пример: Web Application container

+--------------------------------------------------------------+
|                    WEB APPLICATION (Rails)                   |
|                                                              |
|  +--------------+  +--------------+  +------------------+    |
|  | Controllers  |  |   Services   |  |   Background     |    |
|  |              |  |              |  |   Jobs           |    |
|  | - Invoices   |->| - Billing    |  | - PaymentSync    |    |
|  | - Users      |  | - Payments   |->| - ReportBuilder  |    |
|  | - Reports    |  | - Analytics  |  | - Notifications  |    |
|  +------+-------+  +------+-------+  +--------+---------+    |
|         |                  |                   |             |
|         v                  v                   |             |
|                   +--------------+             |             |
|                   | Repositories |<------------+             |
|                   |              |                           |
|                   | - UserRepo   |                           |
|                   | - InvoiceRepo|                           |
|                   +------+-------+                           |
|                          |                                   |
+--------------------------------------------------------------+
                           |
                           v SQL
                    +--------------+
                    |  PostgreSQL  |
                    +--------------+
Рекомендация: создавайте только если это добавляет ценность. Рассмотрите автогенерацию из кода для долгоживущей документации. Component-диаграммы особенно полезны при онбординге новых разработчиков в конкретный сервис.

Level 4: Code

Самый детальный уровень: UML-диаграммы классов, ER-диаграммы и т.д. В большинстве случаев не нужен - код сам себя документирует, а IDE позволяет навигировать по нему.

Когда полезен:

Для большинства проектов достаточно уровней 1-3. Если код хорошо структурирован и покрыт тестами, Level 4 создаёт больше работы по поддержанию актуальности, чем приносит пользы.

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

System Landscape Diagram

Когда нужно показать несколько систем в рамках организации. По сути - Context diagram без фокуса на конкретной системе.

Scope Enterprise / организация / департамент
Аудитория Все

Dynamic Diagram

Показывает взаимодействие элементов во время выполнения: user story, use case, конкретный сценарий. Похоже на UML sequence diagram, но с более свободной раскладкой.

Scope Конкретная feature / user story
Elements На выбор: systems, containers или components

Deployment Diagram

Показывает, как containers деплоятся на инфраструктуру: серверы, VM, Kubernetes, cloud services. Основан на UML deployment diagram.

Scope Одна или несколько систем в конкретном environment (prod, staging, dev)
Elements Deployment nodes, container instances, infrastructure (DNS, load balancers, firewalls)
Аудитория Архитекторы, разработчики, DevOps, SRE

Можно использовать иконки AWS, Azure, GCP - но включайте их в легенду.

Рекомендации

Какие диаграммы создавать

Диаграмма Рекомендация
System Context Да - для каждой системы
Container Да - для каждой системы
Component По необходимости
Code Редко, только для сложных частей
Deployment Да - как минимум для production

Diagrams as Code

Моя позиция: диаграммы должны храниться как код и жить вместе с кодом. Это даёт:
  • Версионирование в Git
  • Code review диаграмм через PR
  • Автоматическое обновление при изменении архитектуры
  • Единый источник правды

Я использую PlantUML с C4 extension. Пример Context диаграммы:

@startuml
!include <C4/C4_Context>
title My Platform - System Context

Person(employee, "Employee", "Firm user")
Person(client, "Client", "End user")

System(platform, "Platform", "Main system")

System_Ext(payments, "Payment Provider", "Processes payments")
System_Ext(email, "Email Service", "Sends notifications")

Rel(employee, platform, "Manages operations")
Rel(client, platform, "Uses services")
Rel(platform, payments, "Processes payments", "HTTPS")
Rel(platform, email, "Sends emails", "SMTP")
@enduml

Инструменты

Советы

Связанные материалы: