issues
search
woowacourse-teams
/
2024-friendogly
강아지 사회화 장려 앱 반갑개 🐶
16
stars
3
forks
source link
분산 환경에서 채팅이 전송되지 않는 버그 수정 / 채팅 RabbitMQ 도입
#616
Open
takoyakimchi
opened
1 week ago
takoyakimchi
commented
1 week ago
요구 사항
현재 사용하고 있는 메시지 큐는 Spring이 제공하는 in-memory 기반 메시지 큐이다.
서버를 2대로 scale-out 하면서, 서로 다른 서버의 웹소켓에 연결되어 있는 경우 채팅이 올바르게 전송되지 않는 문제가 발생하고 있다.
해결 방안
채팅 서버 분리
하지만 채팅 서버는 단일 서버로 돌아가기 때문에 재배포 과정에서 down time이 발생한다. down time 문제를 해결하려고 scale-out하면 같은 문제가 반복될 것이다.
외부 메시지 큐를 도입하고 전용 서버를 따로 둔다.
Redis pub/sub과 RabbitMQ 등이 고려될 수 있다.
이 경우 기술 선정 근거 정리가 선행되어야 한다.
참고1
참고2
현재 구조 -> 분산 환경에서 채팅이 불가능한 형태
출처
변경될 구조 -> 외부 서버에 정의된 메시지 큐가 분산 환경으로 메시지를 전달해 줌
이미지 출처
STOMP에 RabbitMQ를 추가해보았다.
takoyakimchi
commented
6 days ago
RabbitMQ 사용 이유
Spring AMQP에서 기본적으로 지원한다.
STOMP를 지원하기 때문에, 기존 in-memory queue에서 사용하던 형식 그대로 메시지를 주고받을 수 있다.
다른 Message Queue에 비해 가볍고 손쉽게 구현할 수 있다.
takoyakimchi
commented
6 days ago
RabbitMQ 기본 개념
Producer: 메시지 보내는 사람
Consumer: 메시지 받는 사람
Exchange: 메시지가 들어오면 어떤 queue로 보낼지 결정
Binding: exchange로 들어온 메시지를 어떤 queue로 보낼지 결정하는 컴포넌트 (규칙은 routing key로 정함)
Queue: 메시지를 보내기 전까지 보관하는 장소
takoyakimchi
commented
6 days ago
RabbitMQ Exchange 4가지 방식
요구 사항
해결 방안
현재 구조 -> 분산 환경에서 채팅이 불가능한 형태
출처
변경될 구조 -> 외부 서버에 정의된 메시지 큐가 분산 환경으로 메시지를 전달해 줌
이미지 출처
STOMP에 RabbitMQ를 추가해보았다.