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. Если бы границы шли первыми, оба дисквалификатора сработали бы до того, как решения были приняты, а не после.