반응형
채팅 서비스에 관심이 있어 구현하던 중 마주하게된 문제들에 대한 해결방법을 공유하고자 글을 작성한다. 카카오톡 채팅 서비스와 같은 서비스를 구현해보고 싶었는데, 구조를 어떻게 설계하는 것이 좋을까 생각해보았다.
우선 단일 서버 방식이다.
이 방식은 간단하게 클라이언트와의 연결을 서버의 메모리에 map 형태로 클라이언트의 key로 구분하여 저장한 뒤 이를 이용하여 원하는 클라이언트에게 메세지를 전달하는 방식이다. 구현은 간단하지만 이 방식은 단점이 있다. 요즘은 GCP의 Cloud Run과 같은 컨테이너를 이용한 제품을 많이 이용하는데, 이러한 제품을 이용하면 여러 컨테이너가 실행되는 경우 각 컨테이너마다 메모리에 저장된 값이 달라져 원하는 서비스를 구현할 수 없게된다.
이를 해결하기 위한 방법 중 하나는 서버 간 메모리 동기화이다.
이 방식은 A 서버에 요청이 오면 B, C 서버에도 전달하여 상태를 동기화하는 것이다. 이 방식을 이용하면 B, C 서버에 연결된 클라이언트에는 전달이 안되는 문제는 해결되지만, 서버간 상태를 동기화 하기 위해 같은 데이터를 중복하여 보내야 하고 동기화를 위한 별도의 로직을 구현하는 등의 문제가 생긴다.
이를 해결하기 위한 방법은 외부 데이터베이스를 이용하는 것이다.
Redis와 같은 제품을 이용하면 구현도 간단하고 메모리를 이용하므로 네트워크 성능만 받쳐준다면 원하는 성능을 뽑아낼 수 있다.
반응형