알렉스 쉬 님의 "가상 면접 사례로 배우는 대규모 시스템 설계 기초" 책을 정리한 포스팅 입니다.
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 친화적인 설정 저장소/디스커버리 기능 포함
|
'Code' 카테고리의 다른 글
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 10. 알림 시스템 설계 (3) | 2025.08.02 |
---|---|
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 6. 키-값 저장소 설계 (3) | 2025.08.02 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 2. 개략적인 규모 추정 (3) | 2025.08.01 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 1. 사용자 수에 따른 규모 확장성 (2) | 2025.07.31 |
[도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지] 1. 도메인 모델 시작하기 (0) | 2025.06.16 |