- Зачем: - нужен постоянный поток данных для демонстрации работы стека - текущий 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 сообщения
109 lines
3.6 KiB
Markdown
109 lines
3.6 KiB
Markdown
# Генератор событий (MVP)
|
|
|
|
Автономный сервис для стриминга событий в Kafka.
|
|
|
|
## Архитектура
|
|
|
|
```
|
|
generator-service -> Kafka topics -> (потребители отдельно)
|
|
```
|
|
|
|
Генератор работает автономно и не зависит от потребителей (Airflow, ClickHouse).
|
|
|
|
## Режим работы: `steady`
|
|
|
|
- Каждую минуту публикуем переменный объём событий (Poisson + jitter)
|
|
- Распределяем события по 4 топикам:
|
|
- `browser_events`
|
|
- `location_events`
|
|
- `device_events`
|
|
- `geo_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
|
|
|
|
```bash
|
|
# Запустить только генератор
|
|
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` — длительность тика
|
|
|
|
## Тестирование
|
|
|
|
### Локальные тесты
|
|
|
|
```bash
|
|
# Базовые тесты
|
|
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
|
|
```
|
|
|
|
### Интеграционный тест
|
|
|
|
```bash
|
|
# Запустить стек с генератором
|
|
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
|