Перейти к содержанию

ADR-0004 · Границы на старте: модульный монолит, четыре модуля#

Статус:    принят · 2026-09-22
Метод:     D-05 v3.0 · шаблон ADR v1.2
Участники: руководитель ИТ ЦУУ, два аналитика

Учебная запись: часть прогона U-02, система вымышлена. Форма и рассуждение настоящие.

Контекст#

Вход — 00-context.md. Ответы на пять вопросов раздела 1.

1. Где одно и то же слово означает разное#

Слово Значения Пометка
Приём Техническая загрузка документа против принятия как юридического факта. Разговор с юристом на второй встрече занял час именно об этом [орг]
Отчёт У обязанного лица — то, что он сдаёт; у ведомства — сводная форма по всем; у нас — подача [орг]
Акт Акт утилизации (документ утилизатора) против акта сверки (наш) [орг]
Норматив Доля, которую обязаны утилизировать, против правила проверки строки [орг]

Первое различение — граница, остальные три — термины. «Приём» и «принятие» разделяют две разные ответственности: техническую доставку и юридическое решение. Остальные лечатся словарём.

2. Что обязано меняться атомарно#

Операция Атомарность Пометка
Подача + вложения + квитанция + запись журнала Обязательна [требования]
Начисление из принятой подачи Не требуется: считается позже [требования]
Встречная сверка с актами Невозможна: акт сдаёт другая организация [требования]

3. Сколько команд и когда появится вторая#

Одна команда, одиннадцать человек. Личный кабинет у подрядчика — второй владелец уже есть, но у него интерфейс, а не данные [орг]. Плана найма второй команды нет [прогноз].

4. Что по плану будет переписываться в первый год#

Расчёт сбора: методика выходит в декабре, и её реализация почти наверняка будет переписана после первого окна [прогноз]. Встречная сверка: как именно утилизаторы сдают акты, станет известно только в апреле [прогноз].

5. Где профиль или доступность различаются на порядок#

Часть Требование Пометка
Приём Работает 20 дней в апреле; недоступность внутри окна конвертируется в чужой штраф [требования]
Расчёт Может считать неделями; недоступность не задевает никого [прогноз]
Витрина Ведомство забирает раз в сутки [требования]

Различие есть и оно на порядки. Оно и привело к срабатыванию последнего дисквалификатора — см. ниже.

Кандидаты#

Кандидат Принцип
Нулевой: модульный монолит Не резать. Границы внутри процесса
Разрез по языку Приём и Принятие — разные сервисы
Разрез по транзакционной границе Приём+квитанция отдельно от Расчёт+витрина

Дисквалификаторы#

Матрица не заполнялась: дисквалификаторы сделали всю работу. Сработали пять из семи.

Дисквалификатор Сработал Что отсекает
Нет наблюдаемости, трассировки и автовыката Да Системы нет; для разреза это входное требование, а не следствие. Отсекает оба разреза
Сервисов больше, чем команд Да Одна команда на два-три сервиса — один владелец с двойной эксплуатацией
У сервиса нет владельца Да Дежурство по очереди среди одиннадцати; второго дежурного контура нет
Разрез разрывает атомарную операцию Да для разреза по языку Подача, квитанция и журнал обязаны быть атомарны, а «приём» и «принятие» разрезают их пополам
Разрез по техническим слоям Не предлагался —
Разрез рассекает класс защищаемых данных Да для разреза по транзакционной границе Объёмы упаковки — коммерческая тайна; начисления считаются из них, то есть класс оказался бы в двух местах. Документ прав: на старте это исправляется бесплатно
Части с разными целями по доступности в одном кванте Да — и против уже принятого решения См. ниже

Седьмой дисквалификатор сработал против ADR-0003, а не против кандидата#

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

Чем это разрешено. Не разрезом: все три разреза уже отсечены четырьмя дисквалификаторами выше. Отозвано требование, а не проведена линия: у расчёта нет собственной цели по доступности, он живёт по цели приёма. Разные цифры в требованиях недостижимы с первого дня — значит, их не будет ни в требованиях, ни в обещаниях.

Операционное следствие, которое придётся держать: тяжёлый расчёт не запускается внутри окна, и это правило, а не намерение. Проверяется в ADR-0007 по D-09.

Решение#

Модульный монолит, четыре модуля. Владение данными — три схемы из ADR-0002.

Модуль Владеет К чему не имеет права обращаться
Приём intake: подачи, вложения, квитанции, журнал К таблицам billing напрямую
Справочники refs: версионированная копия справочников регулятора К intake вовсе
Расчёт billing: начисления К intake напрямую — только через представление принятых подач
Витрина Ничем; читает представления К записи куда бы то ни было

Граница из языка проведена внутри модуля Приём: техническая загрузка и принятие как юридический факт — два разных шага одной транзакции, с разными именами в коде и разными записями в журнале. Границей между сервисами она не стала, потому что разрезала бы атомарную операцию.

Обоснование#

Две оси заполнены фактами, три — прогнозами, и прогнозы не перевесили. Факты: языковая граница [орг] и транзакционная целостность [требования]. Прогнозы: организационное соответствие, скорость изменений, различие профилей. Правило документа — ось, заполненная прогнозами, не может перевесить ось, заполненную фактами, — здесь и не понадобилось: оба разреза отсечены до сравнения.

Отклонение от умолчания потребовало бы названного дисквалификатора у монолита. Его нет: ни одна из пяти осей не показывает, что монолит здесь дороже.

Последствия#

Что придётся построить в первый месяц: проверку зависимостей между модулями на сборке. Отложенная, она не делается никогда, и через полгода модули станут монолитом без границ — ровно то, о чём предупреждает документ.

Что станет дороже при росте. Если после декабрьской методики расчёт потребует пересчёта принятых подач задним числом, линия Приём ↔ Расчёт окажется проведённой не там, и переносить её придётся вместе с неизменяемыми данными.

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

Чем решение станет проверяемым. Через полгода после первого окна появится история изменений, и вопрос перейдёт в D-02. Порог записывается сейчас: если доля изменений, затрагивающих больше одного модуля, превысит треть — границы проведены неверно.

Условия пересмотра#

  • Появилась история изменений — вопрос переходит в D-02.
  • Появилась вторая команда-владелец.
  • Построены наблюдаемость, трассировка и автоматический выкат — главный дисквалификатор снят.
  • Доля изменений внутри одного модуля упала ниже двух третей.
  • Профиль нагрузки частей разошёлся на порядок по замеру, а не по оценке.

Самая дорогая будущая граница#

Линия между Приём и Расчёт. По ней пойдёт пересчёт задним числом, если декабрьская методика его потребует, — и по ней же проходит класс защищаемых данных. Дважды названа: здесь и в ADR-0002.

Связанные ADR#

Зависит от ADR-0002 (владение данными) и ADR-0003 (одна база — один квант). Седьмой дисквалификатор сработал против ADR-0003; принятый ADR не правится, требование отозвано здесь.


Замечание 6 · Дисквалификатор о кванте не говорит, что именно он отвергает#

Четыре дисквалификатора D-05 сформулированы как «отсекает разрез»: понятно, что отвергнуто. Пятый — о защищаемых данных — говорит прямо: «линию двигают, а не оплачивают». А седьмой, о разных целях по доступности в одном кванте, называет плохое состояние и не называет, что из него отвергается.

Выходов из него два, и они противоположны: разрезать квант или отозвать различие в требованиях. Здесь первый был невозможен — все разрезы уже отсечены, — и пришлось отзывать требование. Но это вывод из обстановки, а не из документа: сам документ не говорит, что при неснимаемом дисквалификаторе отзывается требование.

Сравнение показывает, что это упущение, а не стиль: D-11 педантично называет отвергаемое в каждом из пяти своих дисквалификаторов — «отвергается не ячейка, а требование дать срок», «отвергается длина срока, а не ячейка». Это правило было внесено туда рецензией, до первого применения. D-05 рецензию не проходил.

Замечание 7 · Первое применение сработало как отладка чужих решений#

Из семи дисквалификаторов два сработали не по кандидатам этого ADR, а по решениям, принятым раньше: пятый указал на класс защищаемых данных из ADR-0002, седьмой — на один квант из ADR-0003.

Документ о границах на старте оказался последней точкой, где ранние решения ещё дёшево пересмотреть, — и это довод за то, чтобы он шёл в цепочке раньше, а не на W4. Порядок взят из рабочего процесса: контракты W2, данные W3, границы W4. Если бы границы шли первыми, оба дисквалификатора сработали бы до того, как решения были приняты, а не после.