채팅 시스템 디자인

준하·2025년 1월 16일
0
post-thumbnail

1. 요구사항

1000명이 동시에 채팅할 수 있는 Group-Chat 시스템을 설계해보자.

TPS = 1000 이라고 가정한다.

2. 설계

2-1 웹소켓 연결

1000명의 유저가 단 하나의 서버에 웹소켓을 연결하고 메시지를 주고받는다면,
서버 과부하가 발생할 수 있어 안정적인 서비스를 지원할 수 없다.

이를 해결하기 위해 유저와 웹소켓을 연결하는 Chat Server를 수평적으로 확장하고, 각 서버의 과부하를 모니터링하는 서버를 앞단에 두는 방식을 생각해보았다.

Flow는 다음과 같다.

  1. 유저는 모니터링 서버에 웹소켓 연결이 가능한 서버 IP를 요청한다.

  2. 모니터링 서버는 과부하가 적은 Chat Server의 IP를 반환한다.

  3. 반환받은 IP로 웹소켓을 연결한다.

  4. 웹소켓 연결 후 서버는 Key-Value 저장소에 연결정보를 저장한다.

로드밸런서를 통한 Proxy 방식은, 로드밸런서의 과부하가 발생할 수 있다고 판단하여 초기 연결에만 관여하는 모니터링 서버를 도입하는 방식을 생각해보았다.

또한 추후에 메시지를 보낼 때, 각 유저가 어떤 서버와 연결되어있는지 알아야 메시지를 보낼 수 있으므로 Key-Value 저장소에 연결정보를 저장한다.

메시지를 빠르게 보내려면 Redis와 같은 저장소를 쓰는 것이 좋을 것 같다.

2-2 메시지 발행

메시지 발행의 Flow는 다음과 같다.

  1. 유저가 웹소켓으로 연결된 서버로 메시지를 보낸다.
  2. 서버는 데이터베이스에 특정 채팅방에 속한 유저 아이디를 요청한다.
  3. 응답받은 유저 아이디를 기반으로 Key-Value 저장소에 각 유저가 연결된 서버 IP를 요청한다.
  4. 응답받은 서버 IP에 Relay 요청을 보낸다.
  5. 각 서버는 연결된 유저에 메시지를 보낸다.
profile
A Sound Code in a Sound Body💪

0개의 댓글