Раздел доменов
Доменные границы фиксируются до начала разработки. Их пересмотр в середине цикла — крупная стоимость. Поэтому первый месяц проекта — это всегда обсуждение границ.
Каждое архитектурное решение ограничивает поле возможных следующих решений. Хорошая архитектура — та, в которой эти ограничения работают на команду, а не против неё.
Доменные границы фиксируются до начала разработки. Их пересмотр в середине цикла — крупная стоимость. Поэтому первый месяц проекта — это всегда обсуждение границ.
Между модулями договариваются о моментах синхронизации — где они должны видеть одни и те же данные. Везде остальное — асинхронность по умолчанию.
Каждый модуль получает явный бюджет: CPU, память, очередь, время отклика. Превышение — сигнал к разбору, не к расширению лимита.
Контракты между модулями версионируются отдельно от кода. Совместимость гарантируется минимум на N-2 версии.
Каждая операция оставляет след в централизованном журнале. Без этого расследование инцидентов превращается в гадание.
Для каждого модуля заранее описано, как система ведёт себя при его отказе. Существуют три типа реакции: 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