feat(airflow): пульт мира — работники и выключатель #79

Closed
opened 2026-08-12 21:50:25 +03:00 by ddmitry · 0 comments
Owner

Зачем

Прогонять модельный день сейчас нечем, кроме рук. Владельцу это мешает
проверять процессы стенда вживую, а этап 3 без дага не обойдётся вовсе:
приём заказов — пакетный забор, которым управляет Airflow
(ADR 0008).

Пульт нужен раньше этапа 3 и независимо от него: он про удобство прогона
стенда, а не про заказы. Первым он же и обкатает то, что этапу 3 понадобится
готовым — вызов генератора из задачи Airflow.

Форму пульта и способ вызова решил
ADR 0009:
работники без расписания, выключатель без своей работы, генератор — в
каноническом контейнере.

Что сделать

Работник world_next_day — день пачкой в топик hits, schedule=None,
запуск руками. Параметр «сколько дней» (умолчание 1) даёт разгон вперёд одним
нажимом.

Работник world_live_day — один день в темпе живого режима,
schedule=None, запуск руками.

Выключатель world_live — расписание около 25 минут, создаётся на паузе,
вся работа — TriggerDagRunOperator на world_live_day с ожиданием завершения
и явными состояниями отказа: упал день — покраснел и выключатель.

Общее для трёх:

  • генератор зовётся DockerOperator в образе clickstream-generator:local
    (сеть стенда, команда batch или live); образ уже собирает make up;
  • позицию ставит работник, только по успеху, значением «последний сыгранный
    • 1»; отсутствие переменной означает мир в стартовом состоянии; выключатель
      к переменной не прикасается;
  • день работник берёт из переменной, а не из логической даты прогона:
    календарь Airflow к оси мира отношения не имеет;
  • README получает абзац про пульт в разделе «Как позвать генератор», и плата
    за сокет докера названа там вслух.

Границы

  • Заказов не касается: топика orders ещё нет, генератора слепков тоже.
  • etl_pipeline и переобработка партиций — этап 5, здесь их нет.
  • Сенсоров нет: ждём триггером, довод — ADR 0009.
  • Пакетная автоматика (второй выключатель, на world_next_day) отложена —
    здесь её не делать.
  • Компонент triggerer не заводится, deferrable не применяется.

Сначала прочитать

Проверка

  • make lint и make config-test в корне зелёные.
  • Все три дага разбираются без ошибок, видны в UI, запускаются руками.
  • Два запуска world_next_day подряд двигают переменную на два дня, и
    события обоих доезжают до ODS (подневный счёт — make check-clickhouse).
  • world_next_day с «дней = 3» кладёт три дня и двигает позицию на три.
  • Обрыв работника позицию не двигает; повторный запуск играет тот же день.
  • Снятый с паузы world_live играет день за днём сам: второй прогон
    начинается без нажатия, дочерний прогон виден из выключателя. Пауза
    останавливает мир на границе модельных суток.
  • Ответы на «осталось проверить при исполнении» из ADR 0009 — в теле PR:
    доступ к сокету и GID группы, версия провайдера docker, имя сети стенда.
## Зачем Прогонять модельный день сейчас нечем, кроме рук. Владельцу это мешает проверять процессы стенда вживую, а этап 3 без дага не обойдётся вовсе: приём заказов — пакетный забор, которым управляет Airflow ([ADR 0008](https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/adr/0008-order-ingestion.md)). Пульт нужен раньше этапа 3 и независимо от него: он про удобство прогона стенда, а не про заказы. Первым он же и обкатает то, что этапу 3 понадобится готовым — вызов генератора из задачи Airflow. Форму пульта и способ вызова решил [ADR 0009](https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/adr/0009-world-control.md): работники без расписания, выключатель без своей работы, генератор — в каноническом контейнере. ## Что сделать **Работник `world_next_day`** — день пачкой в топик `hits`, `schedule=None`, запуск руками. Параметр «сколько дней» (умолчание 1) даёт разгон вперёд одним нажимом. **Работник `world_live_day`** — один день в темпе живого режима, `schedule=None`, запуск руками. **Выключатель `world_live`** — расписание около 25 минут, создаётся на паузе, вся работа — `TriggerDagRunOperator` на `world_live_day` с ожиданием завершения и явными состояниями отказа: упал день — покраснел и выключатель. Общее для трёх: - генератор зовётся `DockerOperator` в образе `clickstream-generator:local` (сеть стенда, команда `batch` или `live`); образ уже собирает `make up`; - позицию ставит работник, только по успеху, значением «последний сыгранный + 1»; отсутствие переменной означает мир в стартовом состоянии; выключатель к переменной не прикасается; - день работник берёт из переменной, **а не из логической даты прогона**: календарь Airflow к оси мира отношения не имеет; - README получает абзац про пульт в разделе «Как позвать генератор», и плата за сокет докера названа там вслух. ## Границы - Заказов не касается: топика `orders` ещё нет, генератора слепков тоже. - `etl_pipeline` и переобработка партиций — этап 5, здесь их нет. - Сенсоров нет: ждём триггером, довод — ADR 0009. - Пакетная автоматика (второй выключатель, на `world_next_day`) отложена — здесь её не делать. - Компонент triggerer не заводится, `deferrable` не применяется. ## Сначала прочитать - [`docs/adr/0009-world-control.md`](https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/adr/0009-world-control.md) — форма пульта, способ вызова генератора, список «осталось проверить». - [`docs/specs/2026-08-01-generator.md`](https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/specs/2026-08-01-generator.md), разделы 4 (режимы проигрывателя) и 8 (позиция на оси). - [`docs/adr/0008-order-ingestion.md`](https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/adr/0008-order-ingestion.md) — чем пульт прирастёт на этапе 3. - [`docs/adr/0003-dag-run-state.md`](https://git.dementev.space/ddmitry/clickstream-data-platform/src/branch/main/docs/adr/0003-dag-run-state.md) — правило про конец графа: задача не должна зеленеть при отказе выше. - `dags/test_clickhouse.py` — конвенции файла дага. ## Проверка - [ ] `make lint` и `make config-test` в корне зелёные. - [ ] Все три дага разбираются без ошибок, видны в UI, запускаются руками. - [ ] Два запуска `world_next_day` подряд двигают переменную на два дня, и события обоих доезжают до ODS (подневный счёт — `make check-clickhouse`). - [ ] `world_next_day` с «дней = 3» кладёт три дня и двигает позицию на три. - [ ] Обрыв работника позицию не двигает; повторный запуск играет тот же день. - [ ] Снятый с паузы `world_live` играет день за днём сам: второй прогон начинается без нажатия, дочерний прогон виден из выключателя. Пауза останавливает мир на границе модельных суток. - [ ] Ответы на «осталось проверить при исполнении» из ADR 0009 — в теле PR: доступ к сокету и GID группы, версия провайдера docker, имя сети стенда.
ddmitry added the ready-for-agent label 2026-08-12 21:50:25 +03:00
ddmitry added a new dependency 2026-08-12 21:52:05 +03:00
ddmitry changed title from feat(airflow): даг проигрыша модельного дня to feat(airflow): пульт мира — работники и выключатель 2026-08-13 12:22:57 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Blocks
#5 Этап 3: заказы и каталог
ddmitry/clickstream-data-platform
Reference: ddmitry/clickstream-data-platform#79