안녕하세요 오늘은 Road To MQ 세 번째 아티클인 RabbitMQ 기본 개념입니다!
이제 RabbitMQ, Redis, kafka 등 외부 브로커들을 다루게 되었네요!!
문제점
- 기존에 작성하였던 문제는 데이터가 객체와 1:1로 이루어져 있다는 점이였습니다.
이 점은 기존 https://velog.io/@joonoo3/Road-To-MQ-WebSocket-STOMP로-실시간-통신 글 등에서 정리해 놨습니다! 느슨한결합 등이 있죠
- STOMP를 이용한 MQ방식은 한 가지 문제점이 있습니다.
저번 글에서도 있었던 메세징 방식입니다. 하지만 서버 한 대로는 수많은 메세징을 할 수 없습니다. 또한 MSA가 디폴트인 요즘 한 서버에서 모든 일을 처리하지 않죠.바로 여기서 문제가 발생합니다
이와 같이 같은 구독을 하는 subscriber들이 server1,2에 나눠 접근했지만
publisher가 server1에만 접근해 발행하는 경우 server2에 있는 구독자들은 발행자가 발행을 해도 메세지를 받지 못합니다.이 때 외부 메세지 브로커를 사용하게 됩니다.
https://docs.spring.io/spring-framework/reference/web/websocket/stomp/message-flow.html 두 그림은 Spring DOCS STOMP 탭에 있는 그림입니다.
차이는 SimpleBroker vs StompBrokerRelay 의 차이인데요
TCP 방식으로 외부 메세지 브로커와 통신하여 메세지 발행/수신을 진행한다는 것을 알 수 있습니다.
RabbitMQ에는 4가지 중요 개념이 필요합니다.
- publisher : 이전 개념의 발행자입니다. 메세지를 발행(전송) 합니다.
- consumer : 이전 개념의 구독자입니다. 메세지를 수신합니다
3. exchange : publisher가 발행한 메세지들을 받습니다. 이어서 해당 exchange에 연결된 queue 중 어느 queue에 전송할지 type에 따라 결정합니다.
- queue : exchange가 결정에 따라 전달해준 메세지들을 보관합니다.
Exchange는 총 4가지의 Type을 갖습니다.
1.Direct
direct는 라우팅 키와 맞는 queue로 메세지를 전송합니다.
라우팅 키가 keroro인 queue에 연결된 consumer에게만 메세지가 전달된다.
2.Topic
Topic에는 패턴이 적용되어 라우팅 키의 패턴에 맞는 queue로 메세지를 전송합니다
~roro인 queue에 연결된 consumer에게만 메세지가 전달된다.
옵션으로 *(1개), #(0개 이상)이 있습니다.
3.Header
Header는 요청한 헤더와 맞는 queue로 메세지를 전송합니다.
헤더가 모두 일치하는 queue에만 전달된다
옵션으로는 x-match = all(모든 헤더 일치), x-match = any(하나라도 일치)가 있다 .
헤더가 하나라도 일치하는 queue에 모두 전달된다
4.Fanout
Fanout은 해당 Exchange에 연결된 모든 queue에 메세지를 전달하며 이 때 라우팅 키는 사용되지 않습니다.
Exchange와 연결된 모든 queue에 전달된다.
구현은 다음글에서 볼 수 있습니다!🔫🔫