Техническая архитектура¶
Flussonic Sapsan — серверное приложение, написанное на языке Rust. Все подсистемы работают внутри одного процесса sapsan как задачи асинхронного рантайма tokio и взаимодействуют через типизированные каналы сообщений — без разделяемого мутабельного состояния между подсистемами.
Состав компонентов¶
| Компонент | Назначение |
|---|---|
| Менеджер | загрузка и валидация конфигурации, запуск подсистем, привязка сетевых слушателей, горячая перезагрузка, Admin API |
| Сетевые слушатели | HTTP (HLS, DASH, MPEG-TS, WHIP/WHEP, API), RTSP, RTMP, WebRTC (UDP), SRT-порты потоков |
| Менеджер потоков | жизненный цикл потоков: входы и переключение источников (LSI), прием публикаций, пушеры, скриншоты |
| Транскодер | декодирование и кодирование (FFmpeg): H264/HEVC/AV1, AAC/Opus, мультибитрейтная лесенка |
| Сегментер и живой буфер | нарезка потока на fMP4-фрагменты, кольцевой буфер живого края |
| Менеджер контента | единая поверхность контента: объединяет живой буфер, локальный архив и удаленные архивы; из нее читают все протоколы раздачи |
| DVR | дисковое хранилище архива: часовые append-only блобы, каталог на встроенной KV-базе, фоновый индексер (перестройка, дозаполнение метаданных, очистка) |
| Кластер | чтение архивов с удаленных серверов Sapsan по внутреннему streaming-api |
| Сессии и авторизация | учет сессий зрителей и паблишеров, токены, внешние auth-бекенды |
| Шлюз Peeklio | обратный прокси для устройств за NAT: регистрация агентов, туннели |
| Телеметрия | структурированные логи, метрики Prometheus, трейсы OpenTelemetry |
Потоки данных¶
источники обработка доставка
───────── ───────── ────────
RTSP / MPEG-TS ─┐
SRT / RTMP ├─► LSI ─► [транскодер] ─► сегментер ─► живой буфер ─┬─► HLS / LL-HLS
файл / syntetic ┘ (выбор │ ├─► DASH
WHIP / publish ─────► источника) ▼ ├─► MPEG-TS, SRT, RTSP
DVR ├─► WebRTC (WHEP)
удаленные серверы ──► кластер ──┐ │ └─► пушеры (RTMP/SRT/UDP)
▼ ▼
менеджер контента ◄─────────┘
(live + архив + remote)
- Путь записи: активный вход потока (выбранный LSI) отдает кадры; при необходимости они проходят транскодер; сегментер собирает fMP4-фрагменты, которые попадают в живой буфер и параллельно дописываются в DVR.
- Путь чтения: протокольный модуль запрашивает данные у менеджера контента, который прозрачно выбирает источник — живой буфер, локальный архив или удаленный сервер. Плееры не знают, откуда физически пришли данные.
- Изоляция записи и чтения в DVR: запись каждого потока сериализована в его задаче, чтение идет мимо нее напрямую к блобам через разделяемый кеш — читатели не конкурируют с писателем.
Адресация контента¶
Единица хранения и доставки — фрагмент, адресуемый абсолютным UTC-временем (DTS + timescale). Одно и то же имя фрагмента действует в живом буфере, в архиве и на всех серверах кластера. Это свойство лежит в основе бесшовной склейки эфира с архивом и объединения архивов разных серверов. Контракт URL (маршруты, ссылки в плейлистах, ссылки на фрагменты) определен в одном модуле streaming-api, общем для сервера и кластерных клиентов.
Жизненный цикл конфигурации¶
- Конфигурация читается из
sapsan.yamlи валидируется целиком; невалидная конфигурация не применяется. - По сигналу SIGHUP конфигурация перечитывается: потоки, авторизация и DVR перенастраиваются на лету, слушатели перепривязываются только при смене порта.
- При включенном
config_externalсписок потоков периодически забирается с внешнего сервера; частично невалидные обновления применяются без битых потоков, полностью невалидные — отбрасываются с сохранением рабочей конфигурации.
Технологический стек¶
| Слой | Технология |
|---|---|
| Язык | Rust |
| Асинхронный рантайм | tokio (сетевой ввод-вывод, задачи), rayon (CPU-параллелизм) |
| Аллокатор | jemalloc |
| Транскодирование | FFmpeg |
| Каталог DVR | встроенная key-value база (LSM) |
| Наблюдаемость | OpenTelemetry (OTLP), Prometheus |