피드로 돌아가기
Dev.toInfrastructure
원문 읽기
Redis Pub/Sub과 Delta 전송으로 120k WebSocket 동시 접속 구현
Scaling WebSockets to 100k Connections: Lessons from a Real-Time Cricket App
AI 요약
Context
단일 Node.js 프로세스 기반의 socket.io 구조로 인해 15k 접속 시 Heartbeat 드랍 및 40k 접속 시 Event Loop Lag 3초 발생. O(N) 복잡도의 브로드캐스팅과 재연결 스톰으로 인한 서버 다운타임이라는 구조적 한계 직면.
Technical Solution
- Stateless Gateway 설계: 비즈니스 로직을 배제하고 연결 유지 및 메시지 포워딩만 수행하는 덤(Dumb) 노드 구조 채택
- Redis Pub/Sub 기반 메시지 버스 도입: match_id 기반 채널 구독을 통해 전송 효율을 높인 Fan-out 구조 설계
- ALB Sticky Session 적용: 쿠키 기반 연결 유지를 통해 재연결 시 상태 관리 오버헤드 및 쓰레싱 방지
- Delta Update 방식 적용: 전체 상태 대신 변경분만 전송하여 게이트웨이당 아웃바운드 대역폭 점유율 최소화
- Backpressure 제어 로직 구현: 5초 내 ACK 미응답 클라이언트의 큐를 삭제하고 Resync 이벤트를 통해 서버 OOM 방지
- Reconnection Jitter 도입: 0~5초의 랜덤 지연 시간을 부여하여 재연결 시 ALB에 집중되는 트래픽 부하 분산
실천 포인트
1. WebSocket 라이브러리 선정 시 raw throughput이 높은 uWebSockets.js 검토
2. 재연결 스톰 방지를 위한 클라이언트 사이드 지터(Jitter) 및 서버 사이드 Graceful Drain 구현
3. 대규모 브로드캐스팅 시 Redis Pub/Sub을 활용한 분산 Fan-out 구조 설계
4. 네트워크 불안정 상황을 가정하여 2G 환경 및 에어플레인 모드 테스트 수행