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¶
- A configuração é lida de
sapsan.yamle validada como um todo; uma configuração inválida não é aplicada. - 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.
- Com
config_externalativado, 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 |