기술 블로그
C레벨 - 고난도
Slack의 500만+ WebSocket 동시 세션 처리
실시간
메시징
스케일링
JavaWebSocketVitessMySQLKafka
배경
Slack은 실시간 메시징 플랫폼으로, 메시지 전송부터 수신까지 500ms 이내 글로벌 전송을 목표로 합니다. 500만 이상의 동시 WebSocket 연결을 관리해야 합니다.
도전 과제
500만+ 동시 WebSocket 연결을 유지하면서 메시지를 500ms 이내에 전달해야 합니다. 채널 서버와 게이트웨이 서버 간 라우팅, 일관된 해싱을 통한 세션 관리, 연결 끊김 시 재연결 처리가 핵심 과제였습니다.
해결 방안
Channel Server와 Gateway Server를 분리한 아키텍처를 설계했습니다. Gateway Server가 WebSocket 연결을 관리하고, Channel Server가 메시지 라우팅을 담당합니다. Consistent Hashing으로 채널을 서버에 매핑하고, Vitess를 사용하여 데이터베이스를 수평 확장했습니다.
결과
500만+ 동시 세션 안정 운영, 글로벌 메시지 전송 500ms 이내, 99.99% 가용성 달성.
핵심 인사이트
- 1.Channel Server와 Gateway Server 분리가 확장성의 핵심
- 2.Consistent Hashing으로 세션 라우팅 효율화
- 3.Vitess를 통한 MySQL 수평 확장(샤딩)
- 4.WebSocket 재연결 전략과 메시지 버퍼링