Files
clickstream-ch-kafka-supers…/plans/generator_demo_stream_plan.md
T
ddadminandDmitry Dementiev 8d0c8f46fd docs(docs): обновлен план простого автономного генератора
- Зачем:
  - зафиксировать реалистичный MVP без переусложнения
- Что:
  - оставлен один режим steady для автономного генератора
  - добавлена минимальная статистическая модель потока на базе Poisson
  - уточнены минимальные метрики, история batch и короткий roadmap внедрения
- Проверка:
  - проверен diff и итоговое содержимое plans/generator_demo_stream_plan.md
2026-06-09 17:25:17 +03:00

7.6 KiB

План реализации: простой автономный генератор (rev4)

Дата ревизии: 14 февраля 2026.


1) Цель

Сделать простой генератор, который:

  • работает автономно и не зависит от потребителей;
  • может стабильно работать несколько часов;
  • публикует данные в текущие Kafka-топики по существующему контракту;
  • реально внедряется за короткий срок, без «проекта на недели».

2) Что делаем в MVP (и что не делаем)

Делаем

  • один режим генерации;
  • один автономный сервис (контейнер);
  • простая конфигурация через env;
  • базовые метрики и логи;
  • минимальная история запусков.

Не делаем в MVP

  • много сценариев (promo/incident/...);
  • сложные state machines;
  • сложный replay;
  • сложную оркестрацию с зависимостями от ETL;
  • «идеальный прод» (exactly-once и т.д.).

3) Архитектура MVP

generator-service -> Kafka topics -> (потребители отдельно)

Генератор не вызывает Airflow DAG-и и не ждёт их.
Потребители запускаются по своему расписанию/логике.


4) Единственный режим генерации: steady

Логика режима:

  • каждую минуту публикуем фиксированный объём событий;
  • распределяем события по 4 топикам:
    • browser_events
    • location_events
    • device_events
    • geo_events
  • слегка «оживляем» поток:
    • варьируем объём в небольшом диапазоне;
    • обновляем event_timestamp;
    • сохраняем реалистичные связи event_id <-> location, click_id <-> device/geo.

Этого достаточно, чтобы стенд жил часами и данные выглядели не статично.

4.1 Минимальная статистическая модель (Poisson)

Чтобы линия не была «ровной», используем простую интенсивность событий:

  • число событий на тик: N_t ~ Poisson(lambda_t);
  • базовая интенсивность: lambda_base (например, 200 событий/мин);
  • плавный профиль времени: lambda_t = lambda_base * hour_factor(t).

Где hour_factor(t) можно сделать очень простым:

  • дневное окно: 1.2
  • ночное окно: 0.7
  • остальное время: 1.0

Плюс добавляем «защиту от шума»:

  • N_min и N_max (жёсткие границы);
  • опционально короткое сглаживание по 3 последним тикам.

Итог: поведение уже похоже на живой поток, но код остаётся компактным.


5) Как упростить реализацию

Чтобы не писать сложную генеративную модель:

  1. Берём существующие JSONL как «базовый словарь» валидных событий.
  2. На каждом тике семплируем записи из этого словаря.
  3. Перегенерируем только необходимые поля (event_id, click_id, event_timestamp) с сохранением связности.
  4. Публикуем в Kafka.

Плюс:

  • быстро;
  • совместимо с текущим ODS-парсингом;
  • минимум риска «сломать контракт».

6) Минимальная конфигурация сервиса

Через env:

  • GEN_TICK_SECONDS (по умолчанию 60)
  • GEN_EVENTS_PER_TICK (например, 200)
  • GEN_JITTER_PCT (например, 20)
  • GEN_SEED (для воспроизводимости)
  • KAFKA_BOOTSTRAP_SERVERS
  • GEN_LAMBDA_BASE_PER_MIN (базовый lambda для Poisson)
  • GEN_MIN_EVENTS_PER_TICK (нижняя граница)
  • GEN_MAX_EVENTS_PER_TICK (верхняя граница)

Опционально:

  • GEN_ENABLED (быстро включать/выключать цикл)
  • GEN_HOUR_PROFILE (простая карта коэффициентов по часам)

7) Минимальная наблюдаемость

Логи

  • старт/стоп сервиса;
  • batch_id, объём отправки по топикам;
  • длительность тика;
  • ошибки публикации.

Метрики (минимум)

  • generator_events_total
  • generator_publish_errors_total
  • generator_tick_duration_seconds
  • generator_last_success_timestamp

Минимальная история

Таблица meta.generator_batches (или файл/лог на первом шаге):

  • batch_id
  • started_at
  • finished_at
  • sent_total
  • sent_browser/location/device/geo
  • status

8) План внедрения (короткий и реалистичный)

Шаг 1. Skeleton сервиса

  • отдельная папка generator/;
  • бесконечный цикл с тиком;
  • подключение к Kafka;
  • публикация в 4 топика.

Готово, если:

  • сервис работает 1+ час без падений.

Шаг 2. Контрактная генерация из словаря

  • чтение базовых JSONL;
  • семплирование + обновление ключевых полей;
  • проверка, что downstream не ломается.

Готово, если:

  • ODS/DDS наполняются штатно.

Шаг 3. Логи/метрики/история batch

  • добавить базовые метрики;
  • писать историю batch;
  • оформить runbook запуска/проверки.

Готово, если:

  • можно показать историю работы стенда за несколько часов.

9) Критерии успеха MVP

MVP успешен, если:

  1. Генератор автономно работает 2-4 часа.
  2. Потребители можно останавливать/запускать отдельно, генератор продолжает работу.
  3. Данные остаются совместимыми с текущим пайплайном.
  4. Есть базовые метрики и понятные логи.
  5. Есть история batch-ов для учебного разбора.

10) Что делаем потом (после рабочего MVP)

Когда простой генератор стабильно работает:

  1. Добавляем второй режим (например, «spike»).
  2. Делаем инкрементальных потребителей и расписание ETL.
  3. Расширяем учебные кейсы по observability и DQ.
  4. Усиливаем статистику: например, Gamma-Poisson/Negative Binomial для более «рваного» трафика.

Принцип: сначала работающий простой baseline, потом расширение.