WebRTC ve velkém měřítku: jak Mandraki zvládá masivní skupinové hovory
Jak architektura SFU v Mandraki poskytuje šifrované skupinové videohovory s nízkou latencí — a jak se škáluje na stovky souběžných relací na evropské infrastruktuře.
Skupinové videohovory jsou jednou z těch funkcí, které se uživatelům jeví jako jednoduché, ale pod povrchem skrývají značnou inženýrskou složitost. Hovor jeden na jednoho je relativně přímočarý — dva účastníci si vyměňují média přímo. Jakmile však přidáte třetího účastníka, architektonická rozhodnutí se násobí, a než dosáhnete padesáti účastníků napříč více souběžnými relacemi, máte co do činění se skutečně obtížným problémem distribuovaných systémů.
Tento příspěvek vysvětluje, jak je architektura médií v reálném čase v Mandraki navržena pro masivní škálování — aniž by docházelo ke kompromisům v oblasti šifrování nebo suverenity dat.
Proč ne peer-to-peer
V mesh topologii peer-to-peer posílá každý účastník své mediální streamy přímo všem ostatním účastníkům. Pro hovor s N účastníky každý posílá N-1 streamů a přijímá N-1 streamů. Celkový počet spojení je N*(N-1) a požadavek na šířku pásma pro upload každého účastníka roste lineárně s počtem účastníků.
To funguje přiměřeně pro tři nebo čtyři účastníky s dobrým internetovým připojením. Za touto hranicí se to rozpadá. Účastník s uploadem 5 Mbps posílající video stream 1,5 Mbps může obsloužit pouze tři další účastníky, než svůj upload nasytí. Vytížení CPU pro kódování více streamů rychle stoupá. A síťové podmínky mezi libovolnými dvojicemi účastníků jsou nepředvídatelné.
Mesh topologie je elegantní v teorii a nepraktická ve velkém měřítku.
Přístup SFU
Selective Forwarding Unit (SFU) sedí v centru topologie hovoru. Každý účastník posílá jediný upload stream do SFU. SFU pak tento stream přeposílá všem ostatním účastníkům. Šířka pásma pro upload účastníka je konstantní bez ohledu na počet účastníků — vždy posílá jeden stream. SFU zajišťuje šíření.
Část „selective” je důležitá. SFU jednoduše nevysílá každý stream každému účastníkovi. Činí inteligentní rozhodnutí o přeposílání na základě síťových podmínek, viditelnosti účastníků a dostupné šířky pásma. Pokud je downloadové připojení účastníka omezené, může SFU přeposílat vrstvy s nižším rozlišením. Pokud účastník není aktuálně viditelný v UI (například ve velkém hovoru, kde se v plné velikosti zobrazuje pouze aktivní řečník), může SFU omezit nebo pozastavit přeposílání jeho streamu.
To se zásadně liší od Multipoint Control Unit (MCU), která dekóduje všechny příchozí streamy, kompozituje je do jediného smíšeného streamu, znovu jej zakóduje a posílá kompozit každému účastníkovi. MCU jsou náročné na CPU, přidávají latenci kódování a — což je kritické — vyžadují přístup k médiu v otevřeném textu, což je činí neslučitelnými s end-to-end šifrováním.
SFU přeposílá šifrované pakety bez jejich dekódování. Právě to umožňuje end-to-end šifrování založené na SFrame ve skupinovém hovoru. SFU směruje šifrovaný text.
Architektura SFU v Mandraki
Mandraki používá open-source SFU knihovnu integrovanou přímo do naší infrastruktury. Místo spoléhání na monolitický mediální server třetí strany vnořujeme SFU jako knihovnu do vlastní kódové báze. To nám dává plnou kontrolu nad tím, jak se integruje s naší aplikační vrstvou, signalizačním protokolem a autentizačním systémem.
SFU používá architekturu s více workery. Každý worker je samostatný nativní proces, který zajišťuje vlastní směrování médií s téměř nativním výkonem. Koordinační vrstva spravuje workery, transporty a rozhraní s naší aplikační logikou. Toto oddělení udržuje cestu médií rychlou, zatímco řídicí cesta zůstává flexibilní.
SFU podporuje simulcast a SVC (Scalable Video Coding), které jsou zásadní pro přeposílání adaptivní šířce pásma. Prohlížeče účastníků kódují video v několika kvalitativních úrovních současně. SFU vybírá vhodnou úroveň pro každého příjemce na základě jeho dostupné šířky pásma a kontextu UI.
Škálování na stovky relací
U velkých nasazení je architektura navržena kolem horizontálního škálování s inteligentním směrováním relací.
Nasazení SFU s více instancemi. Více instancí SFU běží napříč zónami dostupnosti. Každá instance registruje svou kapacitu v koordinační vrstvě. Při vytvoření nového hovoru systém vybere SFU instanci s nejvíce dostupnou kapacitou. Účastníci stejného hovoru jsou vždy směrováni do stejné SFU instance pro optimální směrování médií.
Paralelismus na úrovni workerů. Každý SFU proces spouští více nativních workerů — obvykle odpovídajících počtu dostupných CPU jader. Každý worker může nezávisle obsluhovat více místností hovorů. To znamená, že jediný SFU server se 16 jádry může efektivně spravovat desítky souběžných hovorů, každý až s 50 účastníky.
Přeposílání adaptivní šířce pásma. Pro hovory s mnoha účastníky se automaticky aktivuje několik optimalizací. Detekce aktivního řečníka snižuje počet vysokokvalitních streamů, které je třeba přeposílat. Výběr vrstvy simulcastu se stává agresivnějším a upřednostňuje nižší vrstvy pro neviditelné účastníky. Pro účastníky s velmi omezenou šířkou pásma je k dispozici záloha pouze pro zvuk.
Evropské nasazení ve více zónách. Infrastruktura Mandraki běží napříč několika zónami dostupnosti v EU na evropské hyperscale infrastruktuře. Instance SFU jsou nasazeny blízko uživatelů, čímž se snižuje doba zpáteční cesty pro mediální pakety. Veškeré směrování médií zůstává v evropských hranicích — žádné médium není nikdy přenášeno přes infrastrukturu mimo EU.
Průchod přes NAT
Největší síla WebRTC — přímá peer-to-peer konektivita — je zároveň jeho největší výzvou. Většina zařízení sedí za firewally NAT (Network Address Translation), které brání přímým příchozím spojením. WebRTC používá ICE (Interactive Connectivity Establishment) k objevení použitelné síťové cesty, přičemž postupně zkouší přímé připojení, připojení zprostředkované STUN a relé TURN.
Mandraki provozuje vyhrazené TURN servery vedle SFU infrastruktury. TURN funguje jako relé jako poslední možnost — když účastník nemůže navázat přímé připojení k SFU (kvůli restriktivním firewallům, symetrickému NAT nebo firemním proxy serverům), média procházejí TURN serverem. To přidává určitou latenci, ale zajišťuje konektivitu.
TURN servery podporují UDP i TCP a navíc TLS pro prostředí, která povolují pouze HTTPS provoz. Stejně jako vše ostatní v našem stacku běží zcela v rámci EU.
End-to-end šifrování ve velkém měřítku
Architektura SFU je specificky zvolena, protože zachovává kompatibilitu s end-to-end šifrováním. Pomocí WebRTC Encoded Transforms a protokolu SFrame (RFC 9605) jsou mediální snímky šifrovány na zařízení odesílatele, ještě než dosáhnou SFU. SFU přeposílá šifrované snímky příjemcům, kteří je dešifrují lokálně.
SFU nikdy nemá přístup k médiu v otevřeném textu. Směruje šifrovaný text. To znamená, že i ve velkém měřítku — s desítkami účastníků a více souběžnými hovory — záruky šifrování platí. Žádný server v naší infrastruktuře nikdy nevidí ani nezpracovává nešifrovaný zvuk či video.
To je zásadní architektonická volba. Mnoho platforem se chlubí šifrováním, ale používá architektury založené na MCU, které vyžadují dekódování na straně serveru. Přístup SFU v Mandraki znamená, že šifrování není jen funkce — je to strukturální záruka.
Monitoring a spolehlivost
Problémy WebRTC se notoricky obtížně diagnostikují. Sbíráme klientskou telemetrii zahrnující přechody stavu ICE spojení, typy vybraných kandidátních párů, odhady doby zpáteční cesty, míru ztráty paketů a odhady šířky pásma. Tyto metriky jsou shromažďovány a zasílány na náš telemetrický endpoint pro agregaci.
Na straně serveru SFU loguje transportní události, životní cyklus producentů a konzumentů a odhad šířky pásma. V kombinaci s klientskou telemetrií to poskytuje komplexní pohled na kvalitu hovorů, který nám umožňuje systematicky identifikovat a řešit problémy.
Komunikace v reálném čase v masivním měřítku je hluboká inženýrská výzva. Pokračujeme v investicích do mediální infrastruktury, díky níž jsou hovory Mandraki spolehlivé, s nízkou latencí a end-to-end šifrované — a to vše v rámci suverénní evropské infrastruktury.