feat(generator): инкрементальные счётчики manifest без перечитки Kafka
- Зачем:
- world_next_day перечитывал всю историю топиков Kafka ради
накопительных счётчиков — время прогона росло с возрастом мира
(issue #5, находка F9).
- Что:
- счётчики засеваются при import из уже прочитанного артефакта и при
backfill из потока; next-day продвигает их только событиями нового
дня, полного чтения Kafka больше нет;
- катящаяся контрольная сумма — сумма SHA-256 событий по модулю 2^256
(инкремент равен полному пересчёту), старый формат артефакта
принимается без изменений;
- точные множества click_id/user_domain_id вынесены из manifest в
цепочку контент-адресуемых фрагментов (<=10 000 ID, SHA-256-цепочка,
отдельный топик counter_chunks) — потолок сообщения Kafka не грозит,
предел 900 000 байт проверяется явно с понятной ошибкой;
- порядок записи всюду: фрагменты -> manifest -> state; старое локальное
состояние отклоняется с подсказкой перезапустить import;
- документация manifest/state обновлена (ARCHITECTURE, OPERATIONS,
runbook startup-history).
- Проверка:
- make test (216+31) и make lint зелёные;
- живая приёмка на чистом стенде: import 235 с; три прогона
world_next_day — 716/718/716 с (плоское время, O(нового дня));
мир 3->6 дней, 561 942 события; make generated-history-chain-check —
все порции и стыки однородны;
- тест равенства инкремента и полного пересчёта:
test_incremental_counters_equal_full_recompute.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -670,7 +670,12 @@ INSERT INTO dm.daily_traffic SELECT * FROM dm.v_daily_traffic;
|
||||
|
||||
**DAG `world_next_day`** без параметров пакетно добавляет следующий модельный
|
||||
день, запускает `etl_pipeline` с `full_refresh` и сверяет manifest. У него задано
|
||||
расписание каждые 30 минут, но DAG создаётся на паузе и не выполняет пропущенные интервалы.
|
||||
расписание каждые 30 минут, но DAG создаётся на паузе и не выполняет пропущенные
|
||||
интервалы. Счётчики manifest продолжаются из compact-топиков state/manifest и
|
||||
обновляются событиями нового дня; старые data-топики Kafka не перечитываются.
|
||||
Точные множества идентификаторов лежат отдельными неизменяемыми фрагментами, а
|
||||
основная запись manifest хранит только числа и ссылку на их цепочку. Полная
|
||||
пересборка ETL при этом сохраняется намеренно.
|
||||
|
||||
**Подключение к ClickHouse:**
|
||||
- Connection: `clickhouse_default`
|
||||
|
||||
Reference in New Issue
Block a user