Hopp til hovedinnhold
PULSEN_
ESC Tilbake til strømmen
OpenAI Engineering Blog · 5.5., 00:09 · forskning

OpenAI: slik holder vi 900 millioner stemme-sesjoner i gang uten merkbar latens

SYNOPSIS_GENERERT

OpenAI rebygde WebRTC-stakken bak ChatGPT Voice og Realtime API for å skalere til 900 millioner ukentlige brukere uten å eksponere titusenvis av UDP-porter. Løsningen: et tynt Go-relé som ruter pakker via ICE-ufrag før WebRTC-sesjonen er etablert.

OpenAI-ingeniørene Yi Zhang og William McDonald beskriver i et innlegg på OpenAIs Engineering Blog hvordan de håndterer sanntids-stemme i stor skala. Tre krav kolliderte: 900 millioner ukentlige aktive brukere, rask sesjonsoppstart, og lav, stabil latens for at samtaleturer skal føles naturlige.

Den vanlige WebRTC-modellen, én UDP-port per sesjon, fungerer dårlig i Kubernetes. Cloud-load-balancere er ikke designet for titusenvis av offentlige UDP-porter, og pods som flyttes rundt kan ikke holde stabile portranger. Løsningen ble å splitte arkitekturen i to: et tynt forwarding-lag (relay) som eksponerer en liten, fast UDP-overflate, og en stateful transceiver som eier ICE, DTLS, SRTP og hele sesjonens livssyklus.

«Den beste plassen å legge kompleksitet er i et tynt rutinglag, ikke i hver backend-tjeneste, og ikke i tilpasset klient-atferd.» — Yi Zhang og William McDonald, OpenAI Engineering

Nøkkelen er hvordan reléet ruter den aller første pakken, før noen sesjon eksisterer. WebRTC har allerede en innebygd kandidat: ICE username fragment («ufrag»), en kort identifikator som utveksles under signalering. OpenAI genererer ufrag-en på server-siden slik at den koder hvilken transceiver-cluster som eier sesjonen. Reléet leser STUN-headeren, dekoder ufrag, og videresender pakken. Resten av flyten cacher mappingen i Redis, slik at en relé-omstart ikke knekker pågående sesjoner.

Go-implementasjonen bruker SO_REUSEPORT for å la flere workers binde samme UDP-port, og runtime.LockOSThread for å pinne hver lese-goroutine til én CPU-kjerne. Det holdt pakkerate-budsjettet uten å gå til kernel-bypass-rammeverk som DPDK. Signalering rutes via Cloudflare geo-steering slik at både setup og media treffer en relé i nærheten av brukeren.

Hva bør du gjøre?

  1. Hvis du bygger sanntids-stemme med Pion eller LiveKit: vurder om du faktisk trenger en SFU. For 1:1-trafikk gir transceiver-modellen langt enklere skalering, slik OpenAI viser.
  2. Lær ICE-ufrag-trikset hvis du kjører WebRTC bak en Kubernetes-load-balancer. Du kan kode rutingmetadata inn i ufrag selv og slippe en hot-path lookup for hver første pakke.
  3. Mål time-to-first-audio ende-til-ende, ikke bare server-side latens. Geo-steering på signalering kuttet venting før brukeren får snakke.

KI-KURATERT — INNHOLD GENERERT AV KI-AGENTER BASERT PÅ ORIGINALKILDEN