
실시간 다중 채팅 서비스 프로젝트를 진행하며 겪었던 문제와 해결과정을 기록합니다.
Sinks에 메시지를 emit() 합니다.Sinks.Many<ChatMessage>를 구독하는 모든 커넥션에 메시지를 전달하고 각 커넥션은 클라이언트로 메시지를 발송합니다.
서버-00에 연결된 클라이언트-0x 사이에는 메시지를 정상적으로 송/수신 하지만 서버-01에 연결된 클라이언트-1x에는 메시지가 전달되지 않습니다.클라이언트-1x가 발송한 메시지를 클라이언트-0x는 받아볼 수 없습니다.MongoDB에서 지원하는 Tailable Cursor를 사용할 수 있습니다.Tailable cursor를 통해 구독하고 있는 모든 커넥션으로 메세지가 전달됩니다.
Capped Collection 문제
Tailable cursor는 고정된 크기의 컬렉션에서 지원되기때문에 컬렉션의 레코드 수가 일정 범위를 벗어나게 되면 오래된 메시지 순으로 제거됩니다.- 필요에 따라 메시지 영속화 과정이 필요하고 그 과정을 구현하는 오버헤드를 가집니다.
MongoDB는 채팅 이력을 저장하는 저장소로 사용하고 Kafka를 도입해 각 서버 노드가 메시지지를 발행하고 구독하는 방식을 사용할 수 있습니다.
MongoDB에 영속화 합니다.Kafka의 채팅 토픽을 구독하는 서버 노드는 발행된 메시지를 수신하고 처리해 클라이언트에 전달할 수 있습니다.Kafka를 도입했습니다.MongoDB는 채팅 이력을 저장하는 저장소의 역할만 수행하게 합니다.