<시스템 디자인 연습> 채팅 서비스 1 - 아키텍처
작업
여러명이 참여한 채팅방에서 메시지를 입력하고 출력하는 다대다 채팅을 구현한다. 웹소켓으로 구성한 일반적인 형태의 채팅 서버를 만들고 그 성능을 테스트했다.
시스템 구성

- AWS 기반으로 채팅 서버를 구현했다.
- 채팅 서버는 AWS ECS Fargate 로 배포했으며 때에 따라 확장한다.
- 채팅 서버 앞단에 ALB를 두어 웹소켓 트래픽을 로드 밸런싱한다.
- 채팅 서버의 웹소켓 엔드포인트에서 실시간으로 채팅을 입출력한다.
ws://{host}/chats/ws/{channel_id}
channel_id
는 채팅방 역할을 한다. 즉, 같은channel_id
에 접속한 사용자는 메시지 입출력을 공유하는 다대다 채팅에 참여한다.
- 채팅 메시지 작성시 id 생성기 서버에서 id 값을 받아온다.
- 역시 ECS로 배포한 서비스이며 때에 따라 확장한다.
- snowflake-id를 사용한다.
- grpc로 통신한다.
- 채팅을 메시지큐에 발행/구독한다.
- AWS Elasticache Redis 의 pub/sub 을 이용한다.
- 채팅 서버에 웹소켓 연결을 유지하는 동안, 발행/구독하며 메시지를 입출력한다.
- 작성한 메시지는 우선 캐시에 저장한다.
- Celery로 구성한 별도 태스크 서버를 두어 메시지 저장 작업을 비동기로 진행한다.
- 태스크 서버는 메시지 데이터를 Redis에 캐시한다.
refs
- 가상 면접 사례로 배우는 대규모 시스템 설계 기초
- 실시간 댓글 개발기(part.1) – DAU 60만 Alex 댓글의 실시간 댓글을 위한 이벤트 기반 아키텍처 – tech.kakao.com
- 라이브채팅 플랫폼 구현기 1탄 : 개발 언어 및 기반기술 조사
links
Posts in this Series
- <시스템 디자인 연습> 채팅 서비스 2 - 기본 성능 테스트
- <시스템 디자인 연습> 채팅 서비스 1 - 아키텍처
- <시스템 디자인 연습> 피드 서비스 3 - DB 병목
- <시스템 디자인 연습> 피드 서비스 2 - 네트워크 대역폭 한계
- <시스템 디자인 연습> 피드 서비스 1 - 서버 동시성 설정
- <시스템 디자인 연습> 준비