Архитектура — это последовательность решений, а не их сумма.

Каждое архитектурное решение ограничивает поле возможных следующих решений. Хорошая архитектура — та, в которой эти ограничения работают на команду, а не против неё.

Шесть модульных решений, формирующих скелет системы.

М.01 · разделение
M.01

Раздел доменов

Доменные границы фиксируются до начала разработки. Их пересмотр в середине цикла — крупная стоимость. Поэтому первый месяц проекта — это всегда обсуждение границ.

М.02 · координация
M.02

Точки синхронизации

Между модулями договариваются о моментах синхронизации — где они должны видеть одни и те же данные. Везде остальное — асинхронность по умолчанию.

М.03 · ёмкости
M.03

Бюджеты ресурсов

Каждый модуль получает явный бюджет: CPU, память, очередь, время отклика. Превышение — сигнал к разбору, не к расширению лимита.

М.04 · версии
M.04

Версии протоколов

Контракты между модулями версионируются отдельно от кода. Совместимость гарантируется минимум на N-2 версии.

М.05 · аудит
M.05

Полное логирование

Каждая операция оставляет след в централизованном журнале. Без этого расследование инцидентов превращается в гадание.

М.06 · отказ
M.06

Стратегии деградации

Для каждого модуля заранее описано, как система ведёт себя при его отказе. Существуют три типа реакции: graceful degradation (часть функций отключается), fail-fast (модуль возвращает ошибку быстро, не накапливая очередь), circuit-break (модуль временно отключается из маршрутов).

// шаблон

Шаблон описания модуля.

Каждый модуль в нашей документации описан по одному шаблону. Это снижает порог понимания при подключении новых инженеров и упрощает поиск.

# module · {name}.spec
scope:        "что делает модуль, в одной фразе"
inputs:       // список протоколов на вход
  - http:    "REST API endpoints"
  - queue:   "внутренние очереди"
outputs:      // что модуль публикует
  - events:  "события домена"
  - metrics: "метрики SLA"
limits:       // бюджеты ресурсов
  cpu:       2
  mem:       4096
  rps_max:   1200
degradation: "graceful · отключаются необязательные операции"
Освещённые серверные стойки // arch.layer · structural reference