Blog

Hoe je gebruikers in verschillende regio’s verbindt: gesprekken die dicht bij iedereen blijven

· Andrij Tkachenko · 7 min leestijd

Twee serverstapels ver uit elkaar, elk met twee app-vensters ernaast, verbonden door één lange boog waarlangs data beweegt

Een videogesprek dat in tests goed werkt, kan anders aanvoelen zodra je gebruikers over de wereld verspreid zijn. Twee mensen in Singapore praten door elkaar heen, een groepsgesprek met iemand in Canada bevriest alleen voor die persoon, en een livestream blijft bufferen voor kijkers aan de andere kant van een oceaan. De code is voor iedereen dezelfde. Wat verschilt, is de afstand tussen elke persoon en de server waar het gesprek doorheen gaat.

In dit artikel lees je waarom afstand ertoe doet in een gesprek, wat er nodig is om iedereen dicht bij een server te houden, bij gesprekken tussen twee mensen, groepsgesprekken en livestreams, en wat op één plek kan blijven.

Waarom afstand ertoe doet in een gesprek

Licht legt in een glasvezel ongeveer 200 kilometer per milliseconde af, en echte routes zijn langer dan een rechte lijn. Een pakket van Singapore naar Frankfurt en terug doet er zo’n 160 milliseconden over, en van Sydney naar Frankfurt en terug zo’n 280.

Een gesprek is daar gevoelig voor. Als wat iemand zegt er meer dan ongeveer 150 milliseconden over doet om het oor van de ander te bereiken, gaan mensen door elkaar heen praten en wachten ze op antwoorden die al onderweg zijn. Het coderen, het netwerk en de jitterbuffer op elk apparaat voegen hun eigen deel toe, nog voordat de afstand er iets bij doet.

Een gesprek dat via een server loopt, legt twee trajecten af: van de eerste persoon naar de server, en dan van de server naar de tweede. Staat de server in Frankfurt, dan sturen twee mensen in Singapore alles naar Europa en terug, zodat wat ze zeggen ruim na die comfortabele grens aankomt, terwijl ze in dezelfde stad wonen. Staat de server in Singapore, dan kost hetzelfde gesprek een paar milliseconden.

De vraag voor elke app met gebruikers in meer dan één regio is dus via welke server elk gesprek loopt, en hoe dicht die bij de mensen in het gesprek staat.

Gesprekken tussen twee mensen

Een gesprek tussen twee mensen gaat, als het kan, rechtstreeks tussen hun apparaten, zonder server ertussen. De afstand tussen die twee is dan de enige vertraging, en niets maakt die korter.

Als een firewall de directe weg blokkeert, loopt het gesprek via een TURN-relay (STUN- en TURN-servers legt uit waarom). Met één relay in één regio gaat elk gesprek via een relay daarheen, dus twee mensen in Azië van wie de netwerken een relay nodig hebben, praten met elkaar via Europa.

De oplossing is een relay in elke regio waar je gebruikers zitten, waarbij elk apparaat de dichtstbijzijnde gebruikt:

  • Eén naam, beantwoord per regio. De naam van de relay wordt voor elk apparaat omgezet naar de dichtstbijzijnde regio, op basis van latentie of van waar het verzoek vandaan komt. Het apparaat heeft geen instelling nodig, en een nieuwe regio bedient zijn gebruikers zodra de relays daar op die naam antwoorden.
  • Inloggegevens die elke regio accepteert. Relay-inloggegevens worden meestal door je server gemaakt met een geheim dat hij met de relays deelt. Elke regio controleert ze op dezelfde manier, dus een apparaat kan elke relay gebruiken die het bereikt.
  • De poorten van het web in elke regio. Poort 3478 via UDP voor de meeste netwerken, en 443 met TLS voor netwerken die alleen webverkeer toestaan, met een certificaat voor elke naam.

Met een relay dicht bij elk apparaat is een gesprek via een relay nauwelijks trager dan een rechtstreeks gesprek, welke twee landen het ook verbindt.

Groepsgesprekken: één mediaserver, of één per regio

Een groepsgesprek draait op een mediaserver: iedereen stuurt zijn stem en beeld er één keer naartoe, en de server stuurt ze door naar alle anderen, in de kwaliteit waarin elk scherm ze toont (hoe groepsvideogesprekken werken legt het uit). De eenvoudige manier is één server per gesprek: het gesprek start op een server in de regio van wie als eerste deelnam, en iedereen komt op die server terecht.

Dat werkt zolang iedereen in het gesprek in hetzelfde deel van de wereld zit. Met mensen op twee continenten zit een van hen ver van de server, en elke stem en elk beeld dat die persoon verstuurt en ontvangt, neemt de lange weg.

De oplossing is om één gesprek te spreiden over servers in meerdere regio’s:

  • Iedereen maakt verbinding met een server in de eigen regio, de dichtstbijzijnde, en stuurt daar één keer stem en beeld naartoe.
  • De servers geven elke track aan elkaar door. Een beeld gaat één keer tussen regio’s voor elke server die het nodig heeft, niet één keer voor elke kijker, en bereikt iedereen via de server in de eigen regio.
  • Alleen wat bekeken wordt, reist. Een track die niemand in een regio bekijkt, gaat niet naar die regio, en elke regio krijgt alleen de kwaliteit waarin de mensen daar hem tonen.
  • De servers houden één gesprek. Wie erin zit, wie spreekt, wie een scherm deelt en wanneer het eindigt, is op elke server hetzelfde, dus de mensen erin zien één gesprek, niet een paar aan elkaar geknoopte gesprekken.
  • Verbindingen tussen regio’s die standhouden. De tracks tussen regio’s reizen over privéverbindingen of versleutelde tunnels, en verloren pakketten worden daarover opnieuw opgevraagd, zodat een verbinding tussen continenten niet uitloopt op bevroren beelden.

Twee mensen in Warschau en twee in Montreal praten dan elk via een server bij hen in de buurt, en er gaat maar één kopie van elke track over de Atlantische Oceaan.

Livestreams

Een livestream is hetzelfde probleem met één zender en veel ontvangers. De host stuurt het beeld naar een server in de buurt, en elke kijker kijkt via een server in de eigen regio, die de stream één keer van de server van de host krijgt en iedereen bedient die daar kijkt. Een publiek verspreid over veel landen wordt zo dicht bij elke kijker bediend, en in geen enkele regio wachten kijkers op een server aan de andere kant van de wereld.

Wat in één regio kan blijven

Niet alles hoeft dichtbij te zijn. Chatberichten, aanwezigheid, typindicatoren en de andere events van een app zijn klein, en een bericht dat 100 milliseconden later aankomt dan het kon, valt niemand op. Als ze in één regio blijven, blijven hun volgorde en hun geschiedenis eenvoudig, en dat weegt zwaarder dan de milliseconden.

De gebruikelijke verdeling is dus: media dicht bij elke persoon, en events op één plek.

Hoe je gebruikers in verschillende regio’s verbindt: een checklist

  1. Kijk waar je gebruikers zitten. De landen van waaruit ze bellen, vertellen je welke regio’s je eerst nodig hebt.
  2. Zet relays in elk van die regio’s, achter één naam die per regio wordt beantwoord, met inloggegevens die elke regio accepteert, op poort 443 en ook op 3478.
  3. Spreid elk groepsgesprek en elke livestream over regio’s, met iedereen op een server bij hen in de buurt en elke track die één keer tussen regio’s gaat, en alleen zolang hij bekeken wordt.
  4. Houd gesprekken gaande terwijl servers wisselen. Een server die voor onderhoud uit de lucht gaat, verhuist eerst zijn gesprekken naar een andere, zodat niemand ophangt.
  5. Houd events in één regio, tenzij je app een reden heeft om dat niet te doen.

Geen van deze stappen is een kleine klus: elke regio betekent servers om te draaien, bij te werken, te bewaken en uit te breiden, en de verbindingen ertussen zijn een netwerk op zich.

Hoe WordPlus Cloud je gebruikers verbindt

WordPlus Cloud draait het allemaal, dus je app kiest nooit een regio:

  • Onze relays en mediaservers voor gesprekken draaien in Duitsland, Frankrijk, het Verenigd Koninkrijk, Polen, Canada en Singapore, en daarna volgen de Verenigde Staten, Australië, India en Italië. De pagina Zo verbinden we je gebruikers toont ze op een kaart.
  • Elk apparaat bereikt de regio die het dichtst bij is, via één naam die op latentie wordt beantwoord. Een gesprek tussen twee mensen gaat rechtstreeks tussen de apparaten als dat kan, via de relay die het dichtst bij elke persoon staat als een firewall dat blokkeert, en via onze mediaservers als zelfs de relays er niet bij kunnen, zonder op te hangen.
  • Iedereen in een groepsgesprek of livestream maakt verbinding met een mediaserver in de eigen regio, en onze servers geven elke track over privéverbindingen tussen regio’s door, één keer voor elke server die hem nodig heeft, en alleen zolang iemand daar kijkt.
  • Een server die voor onderhoud uit de lucht gaat, verhuist eerst zijn gesprekken naar een andere, en de mensen erin blijven gewoon praten.
  • Berichten en events lopen via onze realtime servers in Duitsland, die meegroeien met het verkeer. Edge-servers in meer regio’s komen eraan en brengen ook de events dichter bij je gebruikers.

Gesprekken tussen twee mensen zijn op elke weg end-to-end versleuteld, en je server bepaalt nog steeds wie wie mag bellen. Het werkt hetzelfde in Better Messages op WordPress en in je eigen apps op Next.js, Laravel, Django en andere stacks, met onze SDK’s. Videogesprekken en groepsgesprekken voor je app laat zien wat de SDK’s je geven.