Code

[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 12. 채팅 시스템 설계

noahkim_ 2025. 8. 3. 13:29

알렉스 쉬 님의 "가상 면접 사례로 배우는 대규모 시스템 설계 기초" 책을 정리한 포스팅 입니다.

 

1. 요구 사항

핵심 기능

항목 설명
1:1 채팅 빠른 메시지 송수신
그룹 채팅 최대 100명
사용자 접속 상태 표시 상태 표시 (온라인 여부 등)
다양한 단말 지원
하나의 계정으로 여러 기기 동시 접속 가능
푸시 알림 실시간 알림 지원
메시지 형태 텍스트 메시지만 지원
메시지 최대 길이 최대 100,000자
채팅 이력 보존 영구 보관
종단 간 암호화 (E2EE) 불필요 (시간 여유 시 고려 가능)

 

플랫폼 및 접근 방식

항목 설명
플랫폼 모바일 및 웹 모두 지원
접속 유형
하나의 계정으로 여러 단말에서 동시 접속 허용

 

시스템 규모 및 성능 요건

항목 설명
일일 능동 사용자 수 (DAU) 약 5천만 명
응답 지연 (latency) 낮아야 함 (실시간 응답 수준 추정)

 

2. 개략적 설계안

통신 방식: 클라이언트-서버

  • 메시지 수신: 송신자 클라이언트로부터 메시지를 수신
  • 수신자 결정 및 전달: 수신자 식별 후 해당 클라이언트에 메시지 전달
  • 오프라인 사용자 메시지 보관: 수신자가 접속하지 않은 경우 보관 후 접속 시 전달

 

통신 프로토콜

  • 신뢰성 있어야 함 → HTTP (TCP 기반)
  • 양방향 전송이여야 함
  • 최적화 기술이여야 함
구분 Polling Long Polling WebSocket
작동 방식 클라이언트가 서버에 주기적으로 메시지 존재 여부를 요청 클라이언트가 서버에 요청
→ 메시지가 오거나 타임아웃 시까지 연결 유지
클라이언트가 서버와 영구적인 양방향 연결 생성
연결 지속성 ❌ (매번 새 요청) ⏱️ 일정 시간 유지 ✅ (항구적 연결)
지연 시간 높음 중간 (상대적으로 낮음) 매우 낮음 (실시간 수준)
서버 부하 높음 (쓸모없는 요청 많음) 중간 (지속적 연결/재연결 필요) 낮음 (효율적 연결 관리 시)
장점 구현이 단순 HTTP 기반
서버 푸시 유사 동작
실시간 양방향 통신
효율적
단점 응답 지연 큼, 트래픽 낭비 연결 재설정 필요
상태 추적 어려움
서버 간 세션 공유 필요
연결 수 유지 어려움
(연결 수 관리, 리소스 필요)
로드밸런싱  필요 없음 필요
(세션 affinity 문제 있음)
필요
(연결 유지 위한 sticky session)
(pub/sub 필요)
방화벽 우회 O (HTTP) O (HTTP) O (HTTP/HTTPS 포트 사용)
적합 사례 단순 알림, 실시간성 불필요한 경우 약간의 실시간성이 필요한 경우 채팅, 게임, 실시간 피드 등

 

3. 초안

서비스명 주요 역할 주요 인터페이스/작업
Connection Service WebSocket 통신 담당
- 클라이언트와 WebSocket 연결 유지
- 알림/메시지 전송 수단 제공
Chat Service 채팅 도메인 관리 (방, 메시지 등)
- 채팅방 생성/참여/관리
- 메시지 저장/조회/캐싱
- 메시지 발행
Notification Service 도메인 이벤트 기반 웹 알림 발행
- 도메인 이벤트 수신
- 사용자 알림 처리
- Connection Service에 알림 전송
Presence Service 접속 상태 추적 및 접속 이벤트 발행
- 접속/해제 이벤트 수신
- 사용자 상태 저장 (Redis 등)
- Connection Service에 접속 상태 알림

 

데이터

타입
구분 데이터 예시 특성 적합한 DB
일반 사용자 데이터 프로필, 설정, 친구 목록 등 상대적으로 작고 구조화됨
→ 일관성, 트랜잭션 필요
✅ 관계형 DB (MySQL, PostgreSQL)
채팅 이력 (Chat History) 메시지 본문, 타임스탬프 등 대용량, 최근 데이터 위주 접근
→ 빠른 쓰기/읽기, 확장성 필요
✅ 분산 NoSQL DB (Cassandra, HBase 등)

 

특징
특성 설명
대용량
수십억 메시지 (예: WhatsApp 하루 600억 메시지)
읽기/쓰기 비율 ≒ 1:1 대부분의 사용자에게는 쓰면 곧 읽힘
최근 메시지 중심 대부분 최근 대화만 조회함
무작위 접근도 존재
과거 메시지 접근 가능 (검색, mention, jump 등)

 

4. 상세 설계

서비스 탐색

  • 클라이언트에게 가장 적합한 서버 인스턴스를 찾아 연결하도록 안내하는 시스템 구성요소
  • 부하 분산 + 지리적 라우팅
도구 설명
Apache Zookeeper
등록된 서버 목록을 관리하고 변경사항 감지 가능 (많이 쓰이지만 무겁고 설정 복잡)
HashiCorp Consul
HTTP 기반 API 제공 + 헬스 체크 내장 + 경량
Eureka (Spring Cloud) Java 기반 MSA 환경에 적합
Nacos, etcd
Kubernetes 친화적인 설정 저장소/디스커버리 기능 포함