Mediation Service
Netflow/IPFIX, RADIUS Accounting, нормализация UDR, агрегация трафика для биллинга.
Mediation Service
Bounded Context: Usage Data Collection & Normalization
Владелец данных: UDR (Usage Detail Record), CDR (raw + normalized)
Технологии: Go, PostgreSQL (TimescaleDB), RabbitMQ (publisher), S3/MinIO
Ответственность
Mediation — промежуточный слой между сетевыми устройствами и биллингом/аналитикой. Собирает, нормализует и агрегирует данные о потреблении. Это high-throughput компонент (миллионы записей/час), поэтому реализован на Go с zero-alloc parsing.
- Collection: Приём Netflow v5/v9, IPFIX, sFlow потоков от маршрутизаторов (UDP listener). Поддержка sampling для снижения нагрузки.
- RADIUS Accounting: Обработка Start/Stop/Interim-Update от FreeRADIUS — основной источник данных о сессиях абонентов.
- Normalization: Преобразование вендор-специфичных форматов в единый UDR (Usage Detail Record). Обогащение данными из Network Inventory (subscription_id, customer_id).
- Aggregation: Агрегация по абоненту/периоду для тарификации (usage-based billing). Hourly/daily rollups.
- Archival: Долгосрочное хранение CDR/UDR в S3/MinIO (СОРМ-2 — 3 года, СОРМ-3 — 6 месяцев трафика).
- Analytics: Предоставление данных для бизнес-аналитики (ARPU, traffic patterns, peak hours, capacity planning).
Объёмы данных и retention
| Тип данных | Источник | Объём (10K абонентов) | Hot storage (TimescaleDB) | Cold storage (S3) |
|---|---|---|---|---|
| RADIUS Accounting | FreeRADIUS | ~50K записей/день | 90 дней | 3 года (СОРМ-2) |
| Netflow/IPFIX | BRAS/Router | ~10M flow/час | 7 дней (агрегаты) | 6 мес (СОРМ-3) |
| Aggregated UDR | Mediation | ~50K записей/день | 1 год | 3 года |
Архитектура
Формат UDR (нормализованный)
message UsageDetailRecord {
string id = 1;
string subscription_id = 2;
string username = 3;
string nas_ip = 4;
string framed_ip = 5;
int64 bytes_in = 6;
int64 bytes_out = 7;
int32 duration_seconds = 8;
string source_type = 9; // "netflow" / "radius_acct" / "snmp"
google.protobuf.Timestamp start_time = 10;
google.protobuf.Timestamp end_time = 11;
}Доменные события
Exchange: mediation.events (Topic)
| Routing Key | Событие | Потребители |
|---|---|---|
usage.reported | UsageReportedEvent | Billing (usage-based тарификация) |
Событие usage.reported публикуется после агрегации — содержит суммарный трафик за период (обычно 1 час) для каждого абонента.
Хранение данных
| Тип данных | Хранилище | Retention |
|---|---|---|
| Raw CDR/UDR | S3/MinIO (Parquet) | 3 года (СОРМ) |
| Normalized UDR | TimescaleDB | 6 месяцев |
| Aggregated (per-hour) | PostgreSQL | 2 года |
| Aggregated (per-day) | PostgreSQL | 5 лет |
TimescaleDB используется для time-series аналитики: графики потребления трафика по абоненту, peak hours, anomaly detection.
Background Jobs (river)
| Job | Расписание | Описание |
|---|---|---|
mediation.aggregate_hourly | Каждый час | Агрегация UDR → hourly_usage |
mediation.aggregate_daily | Ежедневно, 01:00 | Агрегация hourly → daily_usage |
mediation.archive_s3 | Ежедневно, 04:00 | Архивация raw CDR в S3 (Parquet) |
mediation.cleanup | Еженедельно | Удаление normalized UDR старше 6 месяцев |
mediation.anomaly_check | Каждые 30 мин | Детектирование аномального трафика |
Зависимости
- Входящие: Netflow/IPFIX от BRAS, SNMP от OLT, radacct от FreeRADIUS (прямое чтение БД).
- Исходящие:
mediation.events→ Billing. - Хранение: S3/MinIO (архив), TimescaleDB (аналитика).
Ссылки:
- Слой OSS: OSS Layer
- Тарификация: Billing & Finance
- RADIUS Accounting: RADIUS Integration