Skip to content

Arquitectura técnica

Flussonic Sapsan es una aplicación de servidor escrita en Rust. Todos los subsistemas se ejecutan dentro de un único proceso sapsan como tareas del runtime asíncrono tokio e interactúan por canales de mensajes tipados — sin estado mutable compartido entre subsistemas.

Componentes

Componente Función
Gestor carga y validación de la configuración, arranque de los subsistemas, vinculación de los listeners de red, recarga en caliente, Admin API
Listeners de red HTTP (HLS, DASH, MPEG-TS, WHIP/WHEP, API), RTSP, RTMP, WebRTC (UDP), puertos SRT por stream
Gestor de streams ciclo de vida de los streams: entradas y conmutación de fuentes (LSI), publicación, pushers, capturas
Transcodificador decodificación y codificación (FFmpeg): H264/HEVC/AV1, AAC/Opus, la escalera de calidades multibitrate
Segmentador y búfer en vivo troceado del stream en fragmentos fMP4, el búfer circular del borde en vivo
Gestor de contenido la superficie unificada de contenido: reúne el búfer en vivo, el archivo local y los archivos remotos; todos los protocolos de entrega leen de ella
DVR almacenamiento del archivo en disco: blobs append-only por hora, un catálogo sobre una base de datos clave-valor embebida, un indexador en segundo plano (reconstrucción, relleno de metadatos, limpieza)
Clúster lectura de archivos de servidores Sapsan remotos por el streaming-api interno
Sesiones y autorización registro de sesiones de espectadores y publicadores, tokens, backends de autorización externos
Pasarela Peeklio un proxy inverso para dispositivos detrás de NAT: registro de agentes, túneles
Telemetría logs estructurados, métricas de Prometheus, trazas de OpenTelemetry

Flujos de datos

fuentes                   procesamiento              entrega
───────                   ─────────────              ───────
RTSP / MPEG-TS ────┐
SRT / RTMP         ├─► LSI ─► [transcodificador] ─► segmentador ─► búfer en vivo ─┬─► HLS / LL-HLS
archivo / syntetic ┘   (elección                                   │              ├─► DASH
WHIP / publish ─────► de fuente)                                   ▼              ├─► MPEG-TS, SRT, RTSP
                                                                  DVR             ├─► WebRTC (WHEP)
servidores remotos ──► clúster ──┐                                 │              └─► pushers (RTMP/SRT/UDP)
                                 ▼                                 ▼
                             gestor de contenido ◄─────────────────┘
                             (vivo + archivo + remoto)
  • Camino de escritura: la entrada activa del stream (la elegida por LSI) entrega los fotogramas; si hace falta, pasan por el transcodificador; el segmentador ensambla fragmentos fMP4, que entran en el búfer en vivo y, en paralelo, se añaden al DVR.
  • Camino de lectura: un módulo de protocolo pide los datos al gestor de contenido, que elige la fuente de forma transparente — el búfer en vivo, el archivo local o un servidor remoto. Los reproductores nunca saben de dónde llegaron físicamente los datos.
  • Aislamiento de lectura y escritura en el DVR: la escritura de cada stream se serializa en su propia tarea; las lecturas la esquivan y van directo a los blobs a través de una caché compartida — los lectores no compiten con el escritor.

Direccionamiento del contenido

La unidad de almacenamiento y entrega es el fragmento, direccionado por tiempo UTC absoluto (DTS + timescale). El mismo nombre de fragmento es válido en el búfer en vivo, en el archivo y en todos los servidores del clúster. Esta propiedad sostiene la unión sin interrupciones del vivo con el archivo y la fusión de archivos entre servidores. El contrato de URL (rutas, URI de las playlists, referencias a fragmentos) está definido en un único módulo streaming-api, común al servidor y a los clientes del clúster.

Ciclo de vida de la configuración

  1. La configuración se lee de sapsan.yaml y se valida como un todo; una configuración no válida no se aplica.
  2. Al recibir SIGHUP, la configuración se relee: los streams, la autorización y el DVR se reconfiguran al vuelo; los listeners solo se revinculan cuando cambia un puerto.
  3. Con config_external activado, la lista de streams se recoge periódicamente de un servidor externo; las actualizaciones parcialmente inválidas se aplican sin los streams rotos, y las totalmente inválidas se descartan conservando la configuración en funcionamiento.

Pila tecnológica

Capa Tecnología
Lenguaje Rust
Runtime asíncrono tokio (E/S de red, tareas), rayon (paralelismo de CPU)
Asignador jemalloc
Transcodificación FFmpeg
Catálogo del DVR base de datos clave-valor embebida (LSM)
Observabilidad OpenTelemetry (OTLP), Prometheus