Skip to content

Arquitetura técnica

O Flussonic Sapsan é uma aplicação de servidor escrita em Rust. Todos os subsistemas rodam dentro de um único processo sapsan como tarefas do runtime assíncrono tokio e interagem por canais de mensagens tipados — sem estado mutável compartilhado entre subsistemas.

Componentes

Componente Função
Gestor carregamento e validação da configuração, partida dos subsistemas, vinculação dos listeners de rede, recarga a quente, Admin API
Listeners de rede HTTP (HLS, DASH, MPEG-TS, WHIP/WHEP, API), RTSP, RTMP, WebRTC (UDP), portas SRT por stream
Gestor de streams ciclo de vida dos streams: entradas e comutação de fontes (LSI), publicação, pushers, capturas
Transcodificador decodificação e codificação (FFmpeg): H264/HEVC/AV1, AAC/Opus, a escada de qualidades multibitrate
Segmentador e buffer ao vivo fatiamento do stream em fragmentos fMP4, o buffer circular da borda ao vivo
Gestor de conteúdo a superfície unificada de conteúdo: reúne o buffer ao vivo, o arquivo local e os arquivos remotos; todos os protocolos de entrega leem dela
DVR armazenamento do arquivo em disco: blobs append-only por hora, um catálogo sobre um banco de dados chave-valor embutido, um indexador em segundo plano (reconstrução, preenchimento de metadados, limpeza)
Cluster leitura de arquivos de servidores Sapsan remotos pelo streaming-api interno
Sessões e autorização registro de sessões de espectadores e publicadores, tokens, backends de autorização externos
Gateway Peeklio um proxy reverso para dispositivos atrás de NAT: registro de agentes, túneis
Telemetria logs estruturados, métricas do Prometheus, traces de OpenTelemetry

Fluxos de dados

fontes                    processamento               entrega
──────                    ─────────────               ───────
RTSP / MPEG-TS ────┐
SRT / RTMP         ├─► LSI ─► [transcodificador] ─► segmentador ─► buffer ao vivo ─┬─► HLS / LL-HLS
arquivo / syntetic ┘   (seleção                                    │               ├─► DASH
WHIP / publish ─────► de fonte)                                    ▼               ├─► MPEG-TS, SRT, RTSP
                                                                  DVR              ├─► WebRTC (WHEP)
servidores remotos ──► cluster ──┐                                 │               └─► pushers (RTMP/SRT/UDP)
                                 ▼                                 ▼
                              gestor de conteúdo ◄─────────────────┘
                              (ao vivo + arquivo + remoto)
  • Caminho de escrita: a entrada ativa do stream (a escolhida pela LSI) entrega os quadros; se for preciso, eles passam pelo transcodificador; o segmentador monta fragmentos fMP4, que entram no buffer ao vivo e, em paralelo, são anexados ao DVR.
  • Caminho de leitura: um módulo de protocolo pede os dados ao gestor de conteúdo, que escolhe a fonte de forma transparente — o buffer ao vivo, o arquivo local ou um servidor remoto. Os reprodutores nunca sabem de onde os dados vieram fisicamente.
  • Isolamento de leitura e escrita no DVR: a escrita de cada stream é serializada na sua própria tarefa; as leituras a contornam e vão direto aos blobs por meio de um cache compartilhado — os leitores não disputam com o escritor.

Endereçamento de conteúdo

A unidade de armazenamento e entrega é o fragmento, endereçado por tempo UTC absoluto (DTS + timescale). O mesmo nome de fragmento vale no buffer ao vivo, no arquivo e em todos os servidores do cluster. Essa propriedade sustenta a emenda sem interrupções do ao vivo com o arquivo e a fusão de arquivos entre servidores. O contrato de URL (rotas, URIs das playlists, referências a fragmentos) está definido em um único módulo streaming-api, comum ao servidor e aos clientes do cluster.

Ciclo de vida da configuração

  1. A configuração é lida de sapsan.yaml e validada como um todo; uma configuração inválida não é aplicada.
  2. Ao receber SIGHUP, a configuração é relida: os streams, a autorização e o DVR são reconfigurados no lugar; os listeners são revinculados somente quando uma porta muda.
  3. Com config_external ativado, a lista de streams é buscada periodicamente de um servidor externo; as atualizações parcialmente inválidas são aplicadas sem os streams quebrados, e as totalmente inválidas são descartadas mantendo a configuração em funcionamento.

Pilha tecnológica

Camada Tecnologia
Linguagem Rust
Runtime assíncrono tokio (E/S de rede, tarefas), rayon (paralelismo de CPU)
Alocador jemalloc
Transcodificação FFmpeg
Catálogo do DVR banco de dados chave-valor embutido (LSM)
Observabilidade OpenTelemetry (OTLP), Prometheus