- Зачем: - нужен постоянный поток данных для демонстрации работы стека - текущий batch-загрузчик не позволяет показать streaming-сценарии - Что: - добавлен сервис generator с режимом steady (Poisson-интенсивность) - генератор публикует в 4 топика: browser/location/device/geo_events - сохраняются связи event_id и click_id между событиями - сборка через uv для скорости и компактности образа - добавлены команды generator-* в Makefile - комплексные тесты: валидация, статистика, формат сообщений - Проверка: - `docker run --rm -v $(pwd)/..:/workspace -w /workspace/generator generator:test python test_comprehensive.py` — 8/8 тестов - `make generator-up` — 3 тика без ошибок, отправлено 2904 сообщения
Генератор событий (MVP)
Автономный сервис для стриминга событий в Kafka.
Архитектура
generator-service -> Kafka topics -> (потребители отдельно)
Генератор работает автономно и не зависит от потребителей (Airflow, ClickHouse).
Режим работы: steady
- Каждую минуту публикуем переменный объём событий (Poisson + jitter)
- Распределяем события по 4 топикам:
browser_eventslocation_eventsdevice_eventsgeo_events
- Сохраняем связи
event_id <-> location,click_id <-> device/geo
Конфигурация (env)
| Переменная | Описание | По умолчанию |
|---|---|---|
KAFKA_BOOTSTRAP_SERVERS |
Адрес Kafka | kafka:29092 |
GEN_TICK_SECONDS |
Интервал между тиками | 60 |
GEN_LAMBDA_BASE_PER_MIN |
Базовая интенсивность (событий/мин) | 200 |
GEN_JITTER_PCT |
Процент вариативности | 20 |
GEN_MIN_EVENTS_PER_TICK |
Минимум событий за тик | 50 |
GEN_MAX_EVENTS_PER_TICK |
Максимум событий за тик | 500 |
GEN_DATA_DIR |
Путь к JSONL файлам | /data |
GEN_SEED |
Сид для воспроизводимости | — |
GEN_ENABLED |
Включить генерацию | true |
Управление через Makefile
# Запустить только генератор
make generator-up
# Остановить генератор
make generator-down
# Смотреть логи
make generator-logs
# Перезапуск с пересборкой
make generator-restart
Логи и метрики
Логи
=== Tick 1 (batch_id=a1b2c3d4) ===
Generating ~156 base events
Batch a1b2c3d4 completed: sent=624, errors=0, gen_time=0.012s, pub_time=0.234s, total_time=0.247s
browser_events: 156 sent
location_events: 156 sent
device_events: 156 sent
geo_events: 156 sent
Sleeping for 59.8s until next tick
Метрики (в коде)
generator_events_total— всего отправлено событийgenerator_publish_errors_total— ошибки публикацииgenerator_tick_duration_seconds— длительность тика
Тестирование
Локальные тесты
# Базовые тесты
docker run --rm -v $(pwd)/..:/workspace -w /workspace/generator generator:test python test_local.py
# Комплексные тесты (проверка граничных случаев, статистики, формата)
docker run --rm -v $(pwd)/..:/workspace -w /workspace/generator generator:test python test_comprehensive.py
Интеграционный тест
# Запустить стек с генератором
make generator-up
# Проверить логи
make generator-logs
# Проверить сообщения в Kafka
docker compose exec kafka /opt/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server kafka:29092 --topic browser_events --from-beginning
История batch
Хранится в памяти (последние 1000 записей). Поля:
batch_id— идентификатор батчаstarted_at/finished_at— время начала/окончанияsent_total— всего отправленоsent_browser/location/device/geo— по топикамstatus— success/partial/error