OpenAI ужала UDP под WebRTC: relay, transceiver и маршрут по ICE ufrag

Более 900 млн пользователей в неделю получают голос ChatGPT и Realtime API — задержка сети моментально превращается в неловкие паузы и обрывы перебивания. OpenAI переложила классический WebRTC под связку relay и transceiver, чтобы не держать модель «один публичный UDP-порт на сессию», которая ломает автомасштабирование в Kubernetes и раздувает поверхность атаки.
Для большинства сессий это 1:1 — один человек или клиент против одной модели, а не многопользовательский зал, где логичен SFU. Поэтому edge-трансивер завершает клиентский WebRTC, переводит медиапоток во внутренние протоколы для распознавания, инференса и оркестрации, а бэкенды больше не притворяются WebRTC-пирами.
Три ограничения, которые столкнулись в проде
- Футпринт портов: десятки тысяч UDP-портов на сервис плохо дружат с балансировщиками, фаерволами и пересадкой подов.
- Липкость состояния: ICE и DTLS требуют, чтобы пакеты сессии попадали в тот же процесс, который поднял рукопожатие и расшифровку SRTP.
- Первый хоп по миру: без близкого ingress клиент теряет миллисекунды ещё до входа в магистраль OpenAI.
Relay + transceiver без подмены семантики WebRTC
Relay — тонкий UDP-слой с малой публичной точкой входа: он не расшифровывает RTP и не гоняет state machine ICE, а по первому STUN-пакету читает серверный ICE username fragment и пересылает поток на владеющий трансивер. Трансивер по-прежнему видит обычный WebRTC-пайплайн с DTLS и SRTP; клиент не замечает подмены маршрута внутри облака.
- Демультиплексирование: несколько трансиверов слушают общий UDP-сокет на внутреннем IP:port, relay держит минимальный in-memory NAT-сессию между клиентским адресом и целевым процессом.
- Восстановление маршрута: после установления соответствия его подстраховывают Redis-кэшем, чтобы пережить рестарт relay быстрее, чем прилетит следующий STUN.
- Прод-производительность: сервис relay написан на Go, использует
SO_REUSEPORT, закрепление читающих горутин черезruntime.LockOSThreadи заранее выделенные буферы, чтобы не упираться в сборку мусора на горячем пути.
Глобальный вход и сигналинг
Fleet Global Relay развёрнут географически: первый пакет попадает в близкий ingress, что режет RTT, дрожь и потери до того, как аудио попадёт на backbone. Для сигналинга применяют geo- и proximity-steering Cloudflare — HTTP или WebSocket доходят до ближайшего кластера трансиверов, SDP отдаёт адрес relay, а ufrag несёт достаточно метаданных, чтобы Global Relay отправил медиа в нужный регион и процесс.
Урок для любых realtime-сценариев с моделями: сложность держать в узком маршрутизаторе, а не размазывать по каждому сервису инференса и не ломать клиентский стек WebRTC ради облачной эластичности.
Источник: How OpenAI delivers low-latency voice AI at scale.