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¶
- La configuración se lee de
sapsan.yamly se valida como un todo; una configuración no válida no se aplica. - 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.
- Con
config_externalactivado, 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 |