<시스템 디자인 연습> 채팅 서비스 1 - 아키텍처

작업

여러명이 참여한 채팅방에서 메시지를 입력하고 출력하는 다대다 채팅을 구현한다. 웹소켓으로 구성한 일반적인 형태의 채팅 서버를 만들고 그 성능을 테스트했다.

시스템 구성

  1. AWS 기반으로 채팅 서버를 구현했다.
  2. 채팅 서버는 AWS ECS Fargate 로 배포했으며 때에 따라 확장한다.
  3. 채팅 서버 앞단에 ALB를 두어 웹소켓 트래픽을 로드 밸런싱한다.
  4. 채팅 서버의 웹소켓 엔드포인트에서 실시간으로 채팅을 입출력한다.
    1. ws://{host}/chats/ws/{channel_id}
    2. channel_id 는 채팅방 역할을 한다. 즉, 같은 channel_id 에 접속한 사용자는 메시지 입출력을 공유하는 다대다 채팅에 참여한다.
  5. 채팅 메시지 작성시 id 생성기 서버에서 id 값을 받아온다.
    1. 역시 ECS로 배포한 서비스이며 때에 따라 확장한다.
    2. snowflake-id를 사용한다.
    3. grpc로 통신한다.
  6. 채팅을 메시지큐에 발행/구독한다.
    1. AWS Elasticache Redis 의 pub/sub 을 이용한다.
    2. 채팅 서버에 웹소켓 연결을 유지하는 동안, 발행/구독하며 메시지를 입출력한다.
  7. 작성한 메시지는 우선 캐시에 저장한다.
    1. Celery로 구성한 별도 태스크 서버를 두어 메시지 저장 작업을 비동기로 진행한다.
    2. 태스크 서버는 메시지 데이터를 Redis에 캐시한다.

refs

Posts in this Series