OpenAI 저지연 음성 AI 인프라
OpenAI는 실시간 음성 AI 제공의 확장성 문제를 해결하기 위해 분할 릴레이‑플러스‑트랜시버 아키텍처를 구현했습니다. 패킷 라우팅을 프로토콜 종료와 분리함으로써, 표준 Kubernetes 환경 내에서도 자연스러운 대화에 필요한 저지연 요구사항을 유지할 수 있습니다.
Kubernetes에서 WebRTC 확장의 도전 과제
표준 WebRTC 구현은 종종 세션당 하나의 포트 모델에 의존하는데, 이는 OpenAI와 같은 규모(주간 활성 사용자 9억 명 이상)에서 배포할 때 상당한 운영상의 장애물을 만들게 됩니다. 이 모델은 세 가지 주요 제약을 초래합니다:
- 포트 고갈: 서비스당 수만 개의 공개 UDP 포트를 관리해야 하므로 로드밸런서 설정, 방화벽 정책, 롤아웃 안전성 측면에서 복잡성이 증가합니다.
- 보안 위험: 대규모 UDP 포트 범위는 외부에서 접근 가능한 표면을 확대시켜 네트워크 정책 감사를 어렵게 만듭니다.
- 자동 스케일링 마찰: Kubernetes 파드는 자주 재스케줄링되는데, 각 파드가 큰 안정적인 포트 범위를 예약하고 광고하도록 요구하면 탄력성이 약해집니다.
단일 포트‑퍼‑서버 설계는 포트 수를 줄이지만 "상태 고정성" 문제에 직면합니다. ICE(Interactive Connectivity Establishment)와 DTLS(Datagram Transport Layer Security)는 상태를 유지하므로, 특정 세션에 대한 패킷은 해당 세션을 소유한 프로세스로 일관되게 전달돼야 연결 실패를 방지할 수 있습니다.
릴레이 + 트랜시버 아키텍처
이러한 충돌을 해소하기 위해 OpenAI는 다자 통화에 일반적으로 사용되는 선택적 포워딩 유닛(SFU) 모델을 포기하고 트랜시버 모델을 채택했습니다. 이 아키텍처에서 WebRTC 엣지 서비스(트랜시버)는 클라이언트 연결을 종료하고 미디어를 추론 및 오케스트레이션을 위한 내부 프로토콜로 변환합니다.
분할 라우팅 및 종료
이 설계의 핵심은 릴레이(라우팅)와 트랜시버(종료)를 분리하는 것입니다:
- 릴레이: 작은 공개 발자국을 가진 경량 UDP 포워딩 레이어입니다. 미디어를 복호화하거나 ICE 상태 머신을 실행하거나 코덱을 협상하지 않습니다. 패킷 메타데이터를 읽어 목적지를 판단하고 패킷을 전달하기만 합니다.
- 트랜시버: 상태를 유지하는 WebRTC 엔드포인트입니다. ICE 연결 검사, DTLS 핸드셰이크, SRTP 암호화 키, 세션 수명 주기 등 전체 세션 상태를 소유합니다.
ICE ufrag를 통한 첫 패킷 라우팅
첫 패킷에 대한 외부 조회를 중단하지 않기 위해 OpenAI는 **ICE 사용자 이름 조각(ufrag)**을 활용합니다. 세션 설정 중에 트랜시버는 라우팅 메타데이터를 포함한 서버‑사이드 ufrag를 생성합니다.
클라이언트가 첫 STUN(Session Traversal Utilities for NAT) 바인딩 요청을 보내면, 릴레이는 ufrag를 파싱해 라우팅 힌트를 디코딩하고 해당 트랜시버로 패킷을 전달합니다. 라우팅이 확립되면 이후 DTLS, RTP, RTCP 패킷은 메모리 내 세션 맵을 기반으로 흐르며, 릴레이가 재시작될 경우 매핑 복구를 위해 Redis 캐시가 보조 역할을 합니다.
글로벌 도달 범위 및 지연 최적화
OpenAI는 지리적으로 분산된 인그레스 포인트로 구성된 "글로벌 릴레이" 함대를 활용해 클라이언트‑OpenAI 최초 홉을 단축합니다. 이를 통해 라운드‑트립 타임(RTT), 지터, 패킷 손실을 감소시켜 트래픽이 OpenAI 백본에 진입하기 전까지의 품질을 향상시킵니다.
- 지오 스티어링 신호: Cloudflare 지오 및 근접 스티어링을 통해 초기 HTTP 또는 WebSocket 요청이 인근 트랜시버 클러스터에 도달하도록 보장합니다.
- 통합 라우팅: SDP(Session Description Protocol) 응답이 글로벌 릴레이 주소를 제공하고, ufrag는 릴레이가 미디어를 올바른 클러스터와 트랜시버로 라우팅하도록 합니다.
기술 구현 및 성능
릴레이 서비스는 Go로 작성되었으며 커널 바이패스 프레임워크 없이도 높은 처리량을 목표로 최적화되었습니다. 주요 성능 최적화 요소는 다음과 같습니다:
SO_REUSEPORT: 이 Linux 소켓 옵션은 여러 릴레이 워커가 동일 UDP 포트에 바인딩하도록 허용해 커널이 들어오는 패킷을 워커 간에 분산시켜 읽기 루프 병목을 방지합니다.runtime.LockOSThread: UDP‑읽기 goroutine을 특정 OS 스레드에 고정시켜 캐시 지역성을 높이고 같은 흐름의 패킷이 동일 CPU 코어에서 처리되도록 함으로써 컨텍스트 스위칭을 감소시킵니다.- 메모리 관리: 사전 할당 버퍼와 최소 복사를 사용해 할당 오버헤드와 가비지 컬렉션 일시 중지를 줄입니다.
아키텍처 이점 요약
복잡성을 얇은 라우팅 레이어에 집중하고 백엔드 서비스나 클라이언트에 부담을 주지 않음으로써, OpenAI는 표준 프로토콜 의미를 유지하면서 확장 가능한 WebRTC 배포를 달성했습니다. 이는 브라우저와 모바일 앱이 상호 운용성을 유지하도록 보장하면서, 추론 백엔드가 일반 서비스처럼 스케일링하도록 해 WebRTC 피어 역할을 하지 않게 합니다.