Files
clickstream-data-platform/docs/adr/0013-world-lifecycle.md
T
ddadmin 12a5c109b2 feat(etl): добавлен дневной конвейер трансформаций
Зачем:
- Один запуск должен одинаково работать из жизненного цикла, вручную после разгона и повторно после отказа.

Что:
- Добавлена последовательная сцепка DDS и DM с ожиданием каждого слоя.
- DDS дожидается смещений Kafka и очереди доставки ClickHouse за общий срок.
- ETL встроен в создание мира и живой день; документация приведена к новому графу.

Проверка:
- make config-test; make lint.
- make smoke: 21/21; make check-clickhouse: 10/10; make check-services: 7/7.
- make rebuild-storage, живой и пакетный дни, искусственный отказ и ручное восстановление ETL.
2026-08-27 02:43:29 +03:00

5.8 KiB
Raw Blame History

ADR 0013. Жизненный цикл мира ведёт Airflow

Дата: 21 августа 2026 года. Статус: принято. Реализация — тикет #119.

Решение

Compose поднимает службы стенда. Airflow владеет прикладным миром: топиками Kafka, DDL прикладных баз ClickHouse, стартовыми данными и позицией модельного времени. make поднимает инфраструктуру и через REST API запускает нужный даг, дожидаясь его результата.

Безопасный даг world_initialize создаёт мир, если тот ещё не создан. На готовом мире он ничего не меняет и успешно сообщает об этом в журнале. Разрушительный даг world_recreate очищает прикладные базы, топики и позиции их потребителей, затем запускает world_initialize и ждёт его завершения. Канонический DDL применяет отдельная учётная запись Airflow с правами только на прикладную структуру стенда.

world_position остаётся единственным состоянием пульта:

  • переменной нет — стенд ещё не инициализировали;
  • -1 — прежний мир признан недействительным, очистка не завершена;
  • 0 — мир очищен и готов к начальной генерации;
  • 8 и больше — первый несыгранный день готового мира.

world_recreate ставит -1 до первого удаления и 0 только после успешной очистки. world_initialize принимает отсутствие позиции или 0, а значение 8 и больше считает готовым миром. После генерации стартовых дней и успешного приема обоих источников позиция становится 8; затем инициализация последним шагом ждет дневной конвейер etl_pipeline. При отказе преобразований мир остается готовым на позиции 8, а конвейер после исправления запускают рукой. Обычные даги движения мира работают только с готовой позицией.

Почему

Прежняя цепочка делила один процесс между Compose, shell-скриптами и Airflow: одноразовые службы создавали стартовые данные, отдельный сценарий ждал их приёма, а пересборка сама исправляла внутреннюю переменную пульта. Из-за этой границы успешная отправка в Kafka выдавалась за создание мира, повторный make up смешивался с инициализацией данных, а узкая пересборка сохраняла в Kafka сообщения и офсеты прежнего мира.

Airflow уже ведёт последующие дни и приём заказов. Отдав ему начало той же оси, получаем один наблюдаемый процесс и одну точку успеха: зеленая ветка создания в world_initialize подтверждает, что схема создана, стартовый мир принят, его следующий день известен, а слои DDS и DM собраны. Короткая ветка готового мира по-прежнему подтверждает позицию и ничего не меняет.

Что это решение уточняет

  • В ADR 0007 DDL больше не принадлежит etl: прикладную структуру ведёт отдельный lifecycle.
  • В ADR 0009 отсутствие world_position больше не означает готовый стартовый мир. Начальную позицию ставит world_initialize, а работники принимают только 8 и больше.
  • Одноразовые службы Compose и shell-ожидание, описанные прежним устройством хранилища, отменены. Их последовательность стала наблюдаемым графом Airflow.

Отклонено

  • Оставить создание мира в Compose, а позицию исправлять из make rebuild-storage: работает технически, но сохраняет двух оркестраторов одного процесса.
  • Один безусловно разрушительный даг для первого и повторного запуска: обычный make up мог бы стереть уже прожитые дни.
  • Отдельная переменная состояния мира: она дублировала бы world_position и могла разойтись с ней. Значения -1 и 0 выражают нужные переходы в одном месте.
  • Выдать обычной учётной записи etl право удаления баз: рабочий конвейер не должен получать административные права из-за редкой операции восстановления.