refactor(generator): разнесён сервис генератора по src-пакету

- Зачем:
  - перед активными визитами нужно отделить генеративную модель от Kafka, состояния и сервисного цикла.
- Что:
  - перенесены модули генератора в пакет `src/clickstream_generator`.
  - `generator.py` оставлен фасадом и точкой входа с совместимыми импортами.
  - обновлены Dockerfile, тесты, README, спека и issue 02.5.
- Проверка:
  - `docker build -t generator:test generator`.
  - `docker run --rm -v /home/dmitry/sources/clickstream-ch-kafka-superset-demo:/workspace -w /workspace/generator generator:test pytest tests/ -q`.
  - `python -m py_compile generator.py src/clickstream_generator/*.py` в Docker.
This commit is contained in:
Dmitry Dementiev
2026-06-11 15:00:50 +03:00
parent 48e3bf2900
commit 642789d484
19 changed files with 1297 additions and 1189 deletions
@@ -71,22 +71,29 @@
Целевая форма:
- `generator/config.py`конфигурация и её валидация;
- `generator/dictionary.py` — загрузка и индексы исходных JSONL;
- `generator/generation.py` — чистая генеративная модель визита, страниц и пауз;
- `generator/intensity.py` — расчёт бюджета активности: Пуассон, часовой
коэффициент, jitter;
- `generator/kafka_io.py`Kafka publisher, создание топиков, Kafka-state;
- `generator/state.py` — сериализуемое состояние генератора;
- `generator/service.py` — основной сервисный цикл и метрики;
- `generator/generator.py` — тонкая точка входа или совместимый фасад для
старых импортов тестов.
- `generator/generator.py`тонкая точка входа и совместимый фасад для старых
импортов тестов;
- `generator/src/clickstream_generator/config.py` — конфигурация и её валидация;
- `generator/src/clickstream_generator/dictionary.py` — загрузка и индексы
исходных JSONL;
- `generator/src/clickstream_generator/generation.py`чистая генеративная
модель визита, страниц и пауз;
- `generator/src/clickstream_generator/intensity.py` — расчёт бюджета активности:
Пуассон, часовой коэффициент, jitter;
- `generator/src/clickstream_generator/runtime.py` — переходный тиковый слой до
активных визитов;
- `generator/src/clickstream_generator/kafka_io.py` — Kafka publisher, создание
топиков, Kafka-state и история batch;
- `generator/src/clickstream_generator/state.py` — сериализуемое состояние
генератора;
- `generator/src/clickstream_generator/metrics.py` — Prometheus-метрики;
- `generator/src/clickstream_generator/service.py` — основной сервисный цикл.
Сейчас `generator/` не оформлен как Python-пакет: тесты импортируют
`generator/generator.py` как модуль `generator`, а Dockerfile копирует только
`generator.py`. В рамках этой уборки нужно сохранить совместимость импортов и
обновить контейнерный запуск под новую структуру файлов; превращать каталог в
пакет через `__init__.py` не требуется.
`generator.py` остаётся фасадом, потому что тесты и часть документации уже
используют импорт `from generator import ...`. Рабочий пакет называется
`clickstream_generator`, чтобы не путать его с каталогом `generator/` и файлом
`generator.py`. Dockerfile должен копировать `src/` и выставлять
`PYTHONPATH=/app/src`.
Точное разбиение может быть чуть проще, если это уменьшит шум, но граница между
моделью генерации, тиковым runtime и Kafka-интеграцией должна быть явной.
@@ -97,6 +104,9 @@
новый слой состояния, и его нельзя удобно встроить в текущий монолит.
- **Принято:** внешнее поведение генератора не меняется. Цель задачи — форма
кода, а не новая модель данных.
- **Принято:** исходники живут в `generator/src/clickstream_generator/`, а не
россыпью в `generator/`. Причина: так структура ближе к обычному Python-пакету
и проще для учебного чтения.
- **Принято:** `generate_tick_batch()` считать временным переходным механизмом.
После задачи 03 тик должен выпускать созревшие события активных визитов.
- **Отклонено:** ограничиться перестановкой функций внутри `generator.py`.
@@ -118,13 +128,15 @@
- Сервисный контур продолжает публиковать в те же четыре Kafka-топика:
`browser_events`, `location_events`, `device_events`, `geo_events`.
- Dockerfile и запуск контейнера учитывают новую структуру файлов.
- Рабочий пакет импортируется как `clickstream_generator`, при этом старые
импорты через фасад `generator.py` продолжают работать.
- В коде есть ясное место, куда задача 03 добавит активные визиты без расширения
Kafka-слоя и без переписывания генерации одного визита.
## Documentation impact
- После реализации уборки обновить `generator/README.md`: описать новую
структуру файлов и убрать формулировки, которые привязаны к одному
`generator.py`.
структуру `src/clickstream_generator` и убрать формулировки, которые привязаны
к одному `generator.py`.
- Если по ходу будет принято решение удалить или заменить `generator_batch_history`,
это должно быть отдельно отражено в README и в задаче реализации.