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

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