беклог: две задачи из разбора разнесения ответа и свёртки

- предел на размер и число заголовков доставки: спит до деплоя
- сверка живой витрины с пересборкой: отпечатки печатаются, но
  сравнивать их некому — известный путь расхождения записан блокером
This commit is contained in:
av
2026-08-02 11:04:26 +03:00
parent 63bffe2865
commit c28de9796e
3 changed files with 59 additions and 0 deletions
+2
View File
@@ -42,6 +42,8 @@
- [Счётчики слияния переживают ротацию логов](nablyudenie-za-sliyaniem-v-bd.md) — единственный след несравнимых наборов — строка WARN в docker-логе с ротацией 3×10 МБ: событие может произойти и не оставить ничего
- [Цена слияния на широкой доставке](cena-sliyaniya-na-shirokoj-dostavke.md) — 63 МБ на одной координате держат транзакцию 5.15 с при busy_timeout 5 с — соседние доставки уходят в failed
- [Заголовки доставки в архиве рядом с телом](zagolovki-dostavki-v-arhive.md) — Заголовки живут только в базе — потеря базы навсегда ломает вывод слоя при пересборке
- [Предел на размер и число заголовков доставки](predel-na-zagolovki-dostavki.md) — MaxHeaderBytes не задан, в базу заголовки пишутся целиком: дефект спит до деплоя, а просыпается вместе с ним
- [Сверка живой витрины с пересборкой](sverka-vitriny-s-peresborkoj.md) — reindex печатает оба отпечатка, но сравнивать их некому — расхождение с журналом молчит
## низкий
- [Устаревание нижнего слоя после экспорта](ustarevanie-nizhnego-sloya.md) — Нижний слой растёт на ~100 тысяч координат в сутки, а после экспорта Apple он избыточен
@@ -0,0 +1,27 @@
# Предел на размер и число заголовков доставки
**Приоритет:** средний
У тела доставки предел есть (`max_body`), у заголовков — нет ни одного:
`MaxHeaderBytes` серверу не задан, а `delivery.headers` пишутся в базу целиком,
сколько бы их ни пришло. В лог они с недавних пор обрезаются, в базу — нет.
Сегодня отправитель один и он свой, поэтому дефект спит. Просыпается он
**вместе с [деплоем](deploy-rivendell.md)**: у приёма, торчащего наружу,
отправитель перестаёт быть своим по определению. Оценка сверху при доставке раз
в пять минут — сотни мегабайт в сутки в таблице, которую никто не подчищает; а
растёт вместе с ней и стоимость пересборки, которая учёт материализует целиком.
Чинится дёшево и в двух местах сразу: `MaxHeaderBytes` у `http.Server` и предел
на то, что уходит в колонку. Разумно делать одной правкой с
[управлением токенами](upravlenie-sekretami.md) — оба пункта про одно и то же:
приём перестаёт доверять тому, кто с ним говорит.
Осторожно: это путь приёма, а доставка, не попавшая в архив, теряется навсегда.
Отказ по превышению обязан наступать **до** записи тела, а не после, и быть
отличим в логе от отказа обстоятельств.
Готово, когда доставка с заведомо раздутыми заголовками получает внятный отказ,
не оставляя следа в базе, а обычная доставка проходит как раньше.
Связано: `internal/httpapi`, `internal/ingest`, `docs/architecture.md` → «Приём».
@@ -0,0 +1,30 @@
# Сверка живой витрины с пересборкой
**Приоритет:** средний
`healthlog reindex` печатает отпечаток собранной витрины и отпечаток рабочей —
то есть данные для сверки уже есть, и **сравнивать их некому**. Расхождение
живого состояния с тем, что даёт проигрывание журнала, сегодня обнаруживается
только тем, что кто-то вручную запустил пересборку и посмотрел на два числа.
Между тем расхождение — не гипотеза. Известный путь к нему записан блокером
[«Порядок журнала при конкурентных приёмах»](poryadok-zhurnala-na-priyome.md):
доставка, свёрнутая раньше своей предшественницы, уходит в `failed` навсегда, и
живая витрина расходится с пересборкой молча. Пока тот предел не закрыт, сверка
— единственный способ узнать, что он сработал.
Инвариант «состояние есть свёртка журнала» проверяем ровно этим: пересобрать в
отдельный файл (рабочая база не трогается — это уже так и устроено), сверить
отпечатки, расхождение — событие, которое видно. Прогон не бесплатный
(на квартальном журнале десятки минут), поэтому это регламент, а не фоновая
задача сервиса.
Развилка при взятии: кто запускает — `cron` на хосте рядом с деплоем или сам
сервис по расписанию. Первое честнее (пересборка уже сейчас команда, а не
режим сервиса), но требует места под второй файл базы.
Готово, когда расхождение витрины с пересборкой перестаёт зависеть от того,
догадался ли человек посмотреть.
Связано: `cmd/healthlog/reindex.go`, [наблюдаемость](stats-nablyudaemost.md),
[деплой](deploy-rivendell.md).