ADR-0003 · Хранилище отчётного контура: одна реляционная база#
Статус: принят · 2026-09-22
Метод: D-01 v2.1 · рыночный снимок 2026-09-16 · шаблон ADR v1.2
Участники: руководитель ИТ ЦУУ, два аналитика, инфраструктура
Учебная запись: часть прогона U-02, система вымышлена. Форма и рассуждение настоящие.
Контекст#
Вход — 00-context.md; владение данными — ADR-0002.
Запросы, дающие основную нагрузку#
| Запрос | Ключ | Строк | Частота в пике | Задержка |
|---|---|---|---|---|
| Проверка строки документа — обращение к справочнику | Код упаковки, ставка | 1 | 933/с [расчёт] |
микросекунды |
| Приём подачи: документ + вложения + квитанция + журнал | Идентификатор подачи | 1 400 | 0,17/с [расчёт] |
секунды |
| Выдача вердикта по подаче | Идентификатор подачи | 1 | 0,5/с [допущение] |
< 1 с |
| Встречная сверка с актами | Лицо × период | сотни | раз в час | минуты |
| Выгрузка витрины ведомству | Период | миллионы | раз в сутки | часы |
Число в первой строке — главный факт этого ADR, и на входе его не было. Системная частота подач — 0,17 в секунду. У хранилища картина другая: 600 подач в час × 1 400 строк × 4 обращения = 3,36 млн обращений в час, то есть 933 в секунду
[расчёт]. Документ предупреждает об этом прямо: соотношение у системы и у отдельного хранилища бывает перевёрнуто. Здесь оно перевёрнуто в 5 500 раз.
Остальные ответы раздела 1#
| Вопрос | Ответ | Пометка |
|---|---|---|
| Чтение/запись у этого хранилища | Читающий профиль в окне, почти полная тишина между окнами: рабочий цикл ≈ 2 % года [расчёт] |
|
| Объём: задан или выбирается? | Задан: пятилетнее хранение назначено приказом, 200 ГБ в год, ≈ 1 ТБ на горизонте | [приказ] |
| Границы данных уже выбраны — каким критерием? | В ADR-0002 — по темпу изменений, а не по запросам. Проверка по первому вопросу ниже | [схема] |
| Что меняется атомарно | Подача, вложения, квитанция и запись журнала — либо всё, либо ничего | [требования] |
| Допустимая свежесть | Справочники — версия на момент подачи; витрина — сутки | [требования] |
| Кто эксплуатирует | Одиннадцать человек, платформенной команды нет, дежурство по очереди. Управляемая версия обязательна | [орг] |
| Лицензия, поставщик, юрисдикция | Государственная отчётность: хранение только в юрисдикции; зарубежные управляемые сервисы исключены | [приказ] |
Проверка уже выбранной границы — правило D-01 v2.1#
Граница между intake и refs проведена по темпу изменений. Пересчёт по запросам показывает, что самый горячий запрос её пересекает — 933 обращения в секунду идут из проверки в справочники.
Граница устояла, и вот почему. Справочники малы — коды упаковки, ставки, классификаторы, единицы мегабайт [расчёт] — и версия их на момент подачи фиксирована. Значит, они целиком ложатся в память процесса проверки, и пересечение границы исчезает во время исполнения: 933 обращения в секунду не доходят до хранилища вовсе. Линия, проведённая по темпу, во время работы ничего не стоит.
Это ровно тот пересчёт, ради которого правило добавлено в v2.1 после прогона E-03. Оно сработало, предмет проверки нашёлся, и результат — подтверждение чужого решения, а не его отмена.
Дисквалификаторы#
| Условие | Что отсеяно |
|---|---|
| Нет управляемой версии в нашей юрисдикции, а эксплуатировать некому | Все зарубежные управляемые сервисы, включая DynamoDB |
| Не даёт транзакционной границы из четвёртого вопроса | Любая связка, где документ и квитанция пишутся в разные хранилища без компенсации |
| Требование хранить в юрисдикции | То же, что первая строка |
| Лицензия несовместима с моделью поставки | Не сработал. Оператор — АНО, программу не перепродаёт; SSPL и RSAL применимы. Строки снимка с пометкой [не проверено] перед использованием как дисквалификатора не годятся, и здесь они не использовались |
| Команда не умеет и не планирует учиться | Колоночные и wide-column: ни одного человека с опытом [орг] |
Нулевого варианта «расширить имеющееся» здесь нет — расширять нечего. Документ ставит эту колонку условием «если хранилище уже есть», и условие не выполнено. Отсутствие колонки — не пропуск.
Рассмотренные варианты#
Осталось два. Вычеркнуты четыре оси, по которым они не различаются: форма данных, гибкость запросов, требуемая согласованность, транзакционные границы — обе колонки реляционные, различие только в месте хранения вложений.
| Ось | Что записывать | Всё в одной БД | БД плюс объектное хранилище |
|---|---|---|---|
| Паттерны доступа | Выражается ли каждый запрос | Все пять выражаются [схема] |
Все пять, вложения — по ссылке [схема] |
| Профиль нагрузки | Число на нашем профиле | 933/с из памяти, 0,17/с записи [расчёт] |
То же [расчёт] |
| Объём и рост | Сколько влезает до смены топологии | 1 ТБ за пять лет, из них 940 ГБ — вложения [расчёт] |
60 ГБ в БД, 940 ГБ в объектном [расчёт] |
| Операционная стоимость | Кто дежурит, чему учиться | Один контур, одно дежурство, одна модель восстановления [орг] |
Два контура, две модели восстановления, сверка осиротевших объектов [орг] |
| Стоимость владения | Деньги на терабайт в месяц | Дороже за терабайт; на 1 ТБ разница не решает [расчёт] |
Дешевле за терабайт |
| Сила: отношения в данных | Связи через линию | Нет | Ссылка на объект — целостность не обеспечивается базой |
| Сила: транзакции | Нужна ли атомарность | Обеспечена базой | Не обеспечена. Оплачивается двухфазной записью и ежедневной сверкой (DATA-16) |
Решение#
Одна управляемая реляционная база в юрисдикции; вложения — в ней же. Три схемы владения из ADR-0002 живут в этой базе. Справочники версионируются и держатся в памяти процесса проверки.
Обоснование#
Перевесила операционная стоимость, и это единственная ось, где разрыв велик. Одиннадцать человек, платформенной команды нет, дежурство по очереди; второй контур хранения удваивает дежурство, модель резервного копирования и число мест, где ошибка приводит к потере юридически значимого документа.
Сила транзакций решила спор. Инвариант «квитанция — юридический факт» требует атомарности подачи, вложений и квитанции. В одной базе она обеспечена; во втором варианте её нет, и оплачивать её пришлось бы двухфазной записью и сверкой осиротевших объектов — постоянной работой ради экономии, которая на терабайте не окупается.
Эвристика, которая тут и применилась: при равной обратимости берётся то, что дешевле эксплуатировать. Второй тип хранилища стоит дороже, чем кажется.
Последствия#
Что становится дороже. Резервная копия — терабайт, и время восстановления растёт вместе с ней. Условие пересмотра названо числом: если восстановление из резервной копии перестанет укладываться в сутки, вложения выносятся в объектное хранилище, и цена этого выноса — та самая двухфазная запись со сверкой.
Что придётся построить: версионирование справочников с загрузкой в память при старте процесса и при смене версии; контроль того, что процесс проверки работает на той версии, которая записана в подаче.
Отрицательное последствие. Рабочий цикл хранилища — 2 % года: одиннадцать с половиной месяцев база почти простаивает, а в окне обязана выдержать пик. Платим за ёмкость, которая нужна двадцать дней в году, и управляемый сервис здесь дороже собственного железа [расчёт]. Принято: своего железа обслуживать некому.
Чего лишаемся. Дешёвого холодного хранения: вложения пятилетней давности лежат в той же базе по той же цене, что вчерашние.
Условия пересмотра#
- Восстановление из резервной копии перестало укладываться в сутки.
- Справочники перестали помещаться в память процесса — пересечение границы
intake→refsстанет настоящим, и границу придётся пересчитать заново. - Появился аналитический контур с собственным профилем — это отдельное решение, а не расширение этого.
- Объём вложений вырос против расчёта более чем вдвое.
- Изменилось требование к сроку хранения.
Самая дорогая будущая граница#
Вложения внутри основной базы. Пока их 940 ГБ, это удобство; на пяти терабайтах — то, что придётся выносить вместе с пятилетней историей, неизменяемой по закону.
Связанные ADR#
Зависит от ADR-0002: три схемы владения размещаются в выбранной базе. Проверка уже выбранной границы, предписанная D-01 v2.1, проведена здесь и границу подтвердила.
Замечание 5 · Перевёрнутое соотношение нашлось там, где кейс объявили «без нагрузки»#
Вход прогона и оба предлагавших агента независимо записали: нагрузки в кейсе нет, 0,17 запроса в секунду. Первый же вопрос D-01 дал 933 обращения в секунду — в 5 500 раз больше, и ровно того рода, о котором документ предупреждает отдельным абзацем.
Число не изменило решения: справочники малы и живут в памяти. Но оно изменило бы его, будь справочники крупнее, — и на входе его никто не посчитал, потому что вход считает подачи, а не то, во что подача разворачивается внутри.
Это не дефект D-01 — документ этот случай предвидел и поймал. Это наблюдение о входе прогона: строка «нагрузки нет» в 00-context.md была написана по системному числу, то есть ровно той ошибкой, от которой D-01 защищает на своём этапе. Проверить её раньше было нечем: W1 считает оценки на салфетке, а разворот строки в обращения к справочникам виден только когда известно, что справочники есть.