프로젝트에서의 기능 방향
채팅 기능 RabbitMQ라는 외부 브로커를 활용하여 WebSocket 프로토콜을 통해 구현하려고 한다.
해당 프로젝트에서 채팅은 아래와 같은 사항을 요구하고 있다.
- 사용자간 대화를 위한 잦은 메세지 데이터 송수신
- 1:1 채팅방이 여러개 만들어 질 수 있음
- 채팅 기능만 있는 것이 아니기 때문에 부하 분담이 필요함
위와 같은 요구 사항을 만족 시키기 위해 사용 기술은 다음과 같은 순서로 변경 및 수정 되었다.
- WebSocket : 양방향 통신을 통한 데이터 송수신
- STOMP : Binding을 통해 채팅방을 구분하여 Queue에 메세지 전달
- RabbitMQ : 서버 부하를 분담하기 위한 외부 브로커
RabitMQ?
RabbitMQ를 이해하기 위해서는 amqp라는 것을 이해해야 한다.
amqp는 advaced message queuing protocol의 약자로 메세지 프로토콜이다.
이 프로톨의 라우팅 동작을 위해 아래와 같은 세 가지 추상 컴포넌트를 알아보자
- Exchange : 메세지 브로커에서 큐에 메세지를 전달하는 컴포넌트
-> 다양한 라우팅 규칙이 존재
ⅰ) Direct exchange
ⅱ) Fanout exchange
ⅲ) Topic exchange
ⅳ) Headers exchange
- Queue : 메세지를 추가 및 소비하는 디스크 혹은 메모리 상의 자료구조
- Binding : Exchange와 Queue가 어떤 관계에 있는지를 정의하는 컴포넌트
위 추상 컴포넌트를 활용하여 메세지가 전달 되는 방식은 다음과 같다.
- 회원이 메세지를 Exchange에게 puliblish 한다.
- Exchange는 Binding 규칙에 맞게 Queue에 메세지를 라우트한다
-> 여기서 실제 메세지를 저장하는 것이 아닌 복사본을 Queue에 라우트하여 최종적으로 클라이언트에는 참조 주소만 전달 된다.
- broker는 Queue에 저장된 메세지를 구독하고 있는 회원에게 전달한다.
다음 내용부터 어떻게 코드를 구현할 것인지 생각하며 작성해보자
출처
- https://www.rabbitmq.com/tutorials/amqp-concepts.html
- https://devahea.github.io/2019/04/30/AMQ-%EB%AA%A8%EB%8D%B8%EA%B3%BC-Exchange-Queue-Binding-%EC%97%90-%EB%8C%80%ED%95%B4/