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
+7 -5
View File
@@ -50,7 +50,8 @@ user_domain_id (постоянный пользователь, cookie)
## Что генератор делает правильно
Файл `generator/generator.py`, `_calculate_events_count()` (стр. ~232260):
Файл `generator/src/clickstream_generator/intensity.py`,
`calculate_events_count()`:
- **Poisson-процесс** прихода событий: λ на минуту → λ на тик → розыгрыш Пуассона.
- **Дневной коэффициент** `_hour_factor()`: день (918) ×1.2, ночь (05) ×0.7.
@@ -60,8 +61,8 @@ user_domain_id (постоянный пользователь, cookie)
## Исторический корневой дефект: модель сущностей в `generate_batch()`
До среза от 2026-06-11 файл `generator/generator.py`, `generate_batch()` на
каждое событие в батче делал примерно следующее:
До среза от 2026-06-11 прежняя реализация `generate_batch()` в монолитном
`generator/generator.py` на каждое событие в батче делала примерно следующее:
```python
base_browser = self.rng.choice(self.dictionary.browser_events) # случайная сид-строка
@@ -123,8 +124,9 @@ device_event = {**base_device, "click_id": new_click_id} # user_domain_i
## Ссылки
- Код: `generator/generator.py``_calculate_events_count()` (стр. ~232260),
`generate_batch()` (стр. ~262330).
- Код: `generator/src/clickstream_generator/intensity.py`
`calculate_events_count()`; `generator/src/clickstream_generator/generation.py`
`EventGenerator.generate_batch()`.
- Доменная модель: `sql/ddl/dds/30_dds.sql`, `sql/ddl/dm/40_dm.sql`.
- Контекст обсуждения: ветка `docs/advanced-clickstream-course`, дизайн
Superset-дашборда (урок 6 курса).