
1000명이 동시에 채팅할 수 있는 Group-Chat 시스템을 설계해보자.
TPS = 1000 이라고 가정한다.

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

이를 해결하기 위해 유저와 웹소켓을 연결하는 Chat Server를 수평적으로 확장하고, 각 서버의 과부하를 모니터링하는 서버를 앞단에 두는 방식을 생각해보았다.
Flow는 다음과 같다.
유저는 모니터링 서버에 웹소켓 연결이 가능한 서버 IP를 요청한다.
모니터링 서버는 과부하가 적은 Chat Server의 IP를 반환한다.
반환받은 IP로 웹소켓을 연결한다.
웹소켓 연결 후 서버는 Key-Value 저장소에 연결정보를 저장한다.
로드밸런서를 통한 Proxy 방식은, 로드밸런서의 과부하가 발생할 수 있다고 판단하여 초기 연결에만 관여하는 모니터링 서버를 도입하는 방식을 생각해보았다.
또한 추후에 메시지를 보낼 때, 각 유저가 어떤 서버와 연결되어있는지 알아야 메시지를 보낼 수 있으므로 Key-Value 저장소에 연결정보를 저장한다.
메시지를 빠르게 보내려면 Redis와 같은 저장소를 쓰는 것이 좋을 것 같다.

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