Files
clickstream-ch-kafka-supers…/docs/specs/2026-06-11-generator-service-cleanup.md
T
Dmitry Dementiev 48e3bf2900 docs(generator): добавлена задача уборки сервиса
- Зачем:
  - перед задачей активных визитов нужно отделить модель генератора от сервисной обвязки.
- Что:
  - добавлена спека уборки сервиса генератора перед задачей 03.
  - добавлена промежуточная issue 02.5 с критериями приёмки.
  - уточнены требования к Dockerfile и временному тиковому слою.
  - задача 03 заблокирована новой задачей уборки.
- Проверка:
  - просмотрен staged diff через `git diff --cached --stat`.
2026-06-11 13:48:24 +03:00

131 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Уборка сервиса генератора перед активными визитами
Дата: 2026-06-11
Статус: Draft
Связано: [спека математической модели](./2026-06-10-generator-math-model.md),
[спека иерархической переработки](./2026-06-09-generator-rework-hierarchical.md),
[`generator/KNOWN_ISSUES.md`](../../generator/KNOWN_ISSUES.md),
задачи `.scratch/feature-data-generator/issues/01..07`.
## Problem
После первых двух срезов новый генератор уже умеет строить связанный визит и
путь по страницам, но сервисный код начал распухать. В одном
`generator/generator.py` смешаны генеративная модель, чтение сида, тиковая
логика, Kafka, состояние, история пачек, метрики и запуск сервиса.
Следующая задача — активные визиты между тиками — добавит новый слой состояния.
Если продолжить в текущей форме, этот слой ляжет поверх временного
`generate_tick_batch()`, который набирает тик целыми визитами и не соответствует
целевой модели.
## Goals
- Разнести код генератора по понятным учебным модулям без изменения внешнего
поведения сервиса.
- Подготовить место для задачи 03: активные визиты должны появиться в отдельном
тиковом слое, а не внутри большого `generator.py`.
- Явно отделить временные части старой модели от контрактов, которые надо
сохранить.
- Сохранить прежние команды запуска, Kafka-топики, формат сообщений и полезные
метрики.
## Non-goals
- Не реализовывать активные визиты из задачи 03.
- Не добавлять популяцию пользователей, возвраты, калибровку интенсивности или
состояние версии 2.
- Не менять DDL, ETL, витрины или Superset.
- Не делать большой перепил поведения генератора под видом уборки.
## Current state
`generator/generator.py` содержит около тысячи строк и несколько разных
ответственностей:
- `Config` — настройки;
- `EventDictionary` — чтение и индексация JSONL-сида;
- `EventGenerator` — генерация визитов, страниц, пауз и интенсивности;
- `BatchRecord`, `KafkaBatchHistory` — история пачек в Kafka;
- `GeneratorState`, `KafkaStateManager` — состояние версии 1;
- `KafkaPublisher`, `ensure_topics` — работа с Kafka;
- `GeneratorService` — метрики, запуск, основной цикл.
`generate_tick_batch()` сейчас является переходным механизмом: он добирает
событийный бюджет полными визитами. Это допустимо после задач 01-02, но должно
быть заменено в задаче 03 тиковым слоем с активными визитами.
## Options considered
- **Минимальная уборка в одном файле.** Быстро, но файл останется тяжёлым и
следующая задача снова его раздует.
- **Разнести код по модулям.** Чище для чтения, лучше соответствует учебной
цели и даёт место для активных визитов.
- **Сначала выбросить лишнее.** Может заметно сократить код, но требует решения,
какие сервисные возможности больше не нужны.
## Recommended approach
Принят смешанный вариант: разнести код по модулям и по ходу явно отметить или
удалить очевидно временные части, если они не являются внешним контрактом.
Целевая форма:
- `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/` не оформлен как Python-пакет: тесты импортируют
`generator/generator.py` как модуль `generator`, а Dockerfile копирует только
`generator.py`. В рамках этой уборки нужно сохранить совместимость импортов и
обновить контейнерный запуск под новую структуру файлов; превращать каталог в
пакет через `__init__.py` не требуется.
Точное разбиение может быть чуть проще, если это уменьшит шум, но граница между
моделью генерации, тиковым runtime и Kafka-интеграцией должна быть явной.
## Decisions and rejected alternatives
- **Принято:** уборка идёт перед задачей 03. Причина: активные визиты добавляют
новый слой состояния, и его нельзя удобно встроить в текущий монолит.
- **Принято:** внешнее поведение генератора не меняется. Цель задачи — форма
кода, а не новая модель данных.
- **Принято:** `generate_tick_batch()` считать временным переходным механизмом.
После задачи 03 тик должен выпускать созревшие события активных визитов.
- **Отклонено:** ограничиться перестановкой функций внутри `generator.py`.
Это не решает учебную читаемость и не создаёт ясного места для следующих
срезов.
- **Отклонено:** удалить историю пачек без отдельного решения. Её можно
упростить или вынести, но пока не доказано, что она не нужна для демо и
мониторинга.
## Validation
- Все существующие тесты генератора проходят.
- Импорты, которые используют тесты, либо обновлены, либо сохранены через фасад
`generator/generator.py`.
- `generate_batch()` продолжает строить один связанный визит с монотонным
временем, как после задач 01-02.
- Временный `generate_tick_batch()` не остаётся в чистой модели визита: он вынесен
в переходный тиковый слой или явно подготовлен к замене задачей 03.
- Сервисный контур продолжает публиковать в те же четыре Kafka-топика:
`browser_events`, `location_events`, `device_events`, `geo_events`.
- Dockerfile и запуск контейнера учитывают новую структуру файлов.
- В коде есть ясное место, куда задача 03 добавит активные визиты без расширения
Kafka-слоя и без переписывания генерации одного визита.
## Documentation impact
- После реализации уборки обновить `generator/README.md`: описать новую
структуру файлов и убрать формулировки, которые привязаны к одному
`generator.py`.
- Если по ходу будет принято решение удалить или заменить `generator_batch_history`,
это должно быть отдельно отражено в README и в задаче реализации.