Skip to content

Техническая архитектура

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, общем для сервера и кластерных клиентов.

Жизненный цикл конфигурации

  1. Конфигурация читается из sapsan.yaml и валидируется целиком; невалидная конфигурация не применяется.
  2. По сигналу SIGHUP конфигурация перечитывается: потоки, авторизация и DVR перенастраиваются на лету, слушатели перепривязываются только при смене порта.
  3. При включенном config_external список потоков периодически забирается с внешнего сервера; частично невалидные обновления применяются без битых потоков, полностью невалидные — отбрасываются с сохранением рабочей конфигурации.

Технологический стек

Слой Технология
Язык Rust
Асинхронный рантайм tokio (сетевой ввод-вывод, задачи), rayon (CPU-параллелизм)
Аллокатор jemalloc
Транскодирование FFmpeg
Каталог DVR встроенная key-value база (LSM)
Наблюдаемость OpenTelemetry (OTLP), Prometheus