-
실시간 채팅 서비스를 설계Interview 2025. 3. 26. 20:18728x90
시스템 설계 면접에서 자주 나오는 고급 질문으로 면접관은 이 질문을 통해서 다음을 보고 싶어 합니다.
- 실시간성에 대한 이해
- 메시징 시스템 설계 경험
- 대규모 트래픽 처리 능력
- 장애 처리 및 확장성 고려
- 사용자/채팅방/메시지 데이터 모델링 능력
질문: 실시간 채팅 서비스를 설계해보세요
1. 요구사항 정리 (Clarifying Questions)
기능적 요구사항
- 1:1 채팅, 그룹 채팅
- 메시지 전송, 수신
- 메시지 읽음 여부 표시
- 메시지 히스토리 저장/조회
- 온라인 상태 표시
비기능적 요구사항
- 실시간 메시징 (Low Latency)
- 확장성 (수백만 유저)
- 장애 복구, 내결함성
- 보안 (인증/암호화)
“혹시 메시지는 1주일 동안만 저장되면 될까요, 아니면 영구 저장인가요?”
“서비스 지역이 글로벌인가요? 한국 중심인가요?”2. 아키텍처 개요
[Client] <--> [API Gateway] <--> [Chat Service (WebSocket Server)] ↕ [Message Queue (Kafka)] ↕ [Chat Worker (Persistence)] ↕ [DB (MySQL/RDS + Redis)] ↕ [Notification / Push Service]3. 주요 컴포넌트 설명
클라이언트
- Web, Android, iOS 클라이언트
- WebSocket 연결 유지
WebSocket 서버
- 각 유저가 접속 시 WebSocket 커넥션 생성
- 사용자 인증 (JWT 등)
- 채팅방 룸 관리 (Room ID)
- 메시지 브로드캐스팅
- 장애 시 커넥션 재연결 로직 포함
메시지 큐 (Kafka / NATS / RabbitMQ)
- WebSocket 서버와 Worker 간 decoupling
- 메시지 순서 보장 (topic-partition 구조 활용)
Chat Worker
- 메시지를 Kafka consumer로 받아 DB에 저장
- Redis에 최근 메시지 캐싱 (빠른 조회)
- 읽음 처리 및 상태 업데이트
데이터베이스
- MySQL: 메시지 기록, 사용자 정보, 채팅방 정보
- Redis: 실시간 세션 정보, 최근 메시지, 읽음 처리, 온라인 상태 캐싱
푸시/알림 서비스
- 상대방이 오프라인이면 Push 알림 (FCM, APNs)
- 알림 중복/스팸 방지
4. 데이터 모델 예시
사용자
users(id, name, profile_url, last_seen_at)채팅방
chat_rooms(id, is_group, name, created_at) chat_room_members(room_id, user_id)메시지
messages(id, room_id, sender_id, content, created_at, status)5. 확장성과 장애 대응
- WebSocket 서버는 Stateless하게 구성 → 여러 대로 수평 확장
- Kafka로 메시지 처리 분리 → 메시지 누락/중복 방지
- Redis에 세션 정보 저장 → 연결 복구 시 빠른 복원
- S3 or Object Storage를 활용한 대용량 파일 메시지 전송 (예: 사진/동영상)
- DB 샤딩 or 채팅방 단위 파티셔닝 고려
6. 보안 고려사항
- 메시지 암호화 (전송 시 TLS, 저장 시 선택적)
- JWT 인증 + 만료 정책
- 사용자 간 권한 확인
- WebSocket abuse 방지 (rate limiting)
7. 추가적으로 고려할 점
- 오프라인 메시지 보관
- 메시지 삭제/편집
- 메시지 전송 실패 재시도
- 채팅봇 연동
마무리 정리 (면접 때 말하기 좋은 요약)
“실시간성과 확장성을 위해 WebSocket 기반 서버를 Kafka와 decoupling 해 구성했고, Redis로 세션과 읽음 상태를 처리하여 빠른 응답성을 유지합니다. 메시지는 MySQL에 저장하고, 푸시 알림은 오프라인 사용자에만 보내 성능 최적화를 했습니다. 장애 상황에서도 메시지 유실이 없도록 Kafka를 중심으로 구성했고, 수평 확장이 쉬운 구조로 설계했습니다.”
728x90'Interview' 카테고리의 다른 글
쉽게 설명하는 Forward Index vs Inverted Index (0) 2025.03.25 Elasticsearch/OpenSearch 관련 인터뷰 질문 (0) 2025.03.25 go 언어 관련 인터뷰 질문들 (0) 2025.03.24 concurrency(동시성)와 parallelism(병렬성)의 차이 (0) 2025.03.24 Error Budget의 개념과 소진 시 대응 방안 (0) 2025.03.18