채팅 시스템은 실시간 1:1, 그룹 메시지를 전달하는 분산 서비스다. 카카오톡, WhatsApp, Slack이 대표 사례다.
요구사항
기능:
- 1:1 및 그룹 채팅 (최대 1000명)
- 메시지 전달 확인 (전송/수신/읽음)
- 온라인/오프라인 상태
- 다중 디바이스 지원
규모:
- DAU 5천만
- 사용자당 일 40개 메시지 → 20억 건/일
- 피크 초당 5만 건
실시간 연결 방식
WebSocket (채팅 서버):
- 양방향 지속 연결
- 낮은 레이턴시
- 서버 상태 유지 (stateful)
Long Polling vs SSE vs WebSocket:
Long Polling: 클라이언트가 반복 요청 → 비효율
SSE: 서버 → 클라이언트 단방향
WebSocket: 양방향 풀듀플렉스 ✓ (채팅에 최적)
메시지 전달 아키텍처
사용자 A ──WebSocket──> 채팅 서버1
↓ 메시지 저장 (Cassandra)
↓ 메시지 큐 (Kafka)
채팅 서버2 → 사용자 B (WebSocket)
채팅 서버3 → 오프라인 → Push 알림
서비스 디스커버리 (ZooKeeper):
어떤 사용자가 어느 채팅 서버에 연결됐는지 추적
sql
-- 채팅방 메시지 테이블
CREATE TABLE messages (
channel_id UUID,
message_id BIGINT, -- Snowflake ID (시간순 정렬)
sender_id UUID,
content TEXT,
created_at TIMESTAMP,
PRIMARY KEY ((channel_id), message_id)
) WITH CLUSTERING ORDER BY (message_id DESC);
-- 읽음 확인
CREATE TABLE message_receipts (
channel_id UUID,
user_id UUID,
last_read BIGINT, -- 마지막으로 읽은 message_id
PRIMARY KEY ((channel_id), user_id)
);
관련 문서
- •[[notification-system|알림 시스템 설계]]
- •[[news-feed-design|뉴스 피드 설계]]
- •[[global-id-generator|글로벌 ID 생성기]]