최근에 웹 소켓을 이용하여 실시간 통신 및 비동기 통신을 공부하면서 메시지 브로커 소프트웨어인 RabbitMQ를 사용하게 되었다. RabbitMQ에 대하여 자세히 알아보면서 해당 글을 작성하게 되었다. 해당 글을 읽게 되는 사람들도 나와 비슷한 이유이지 않을까 싶다.
RabbitMQ는 쉽게 말하면 오픈 소스 메시지 브로커 미들웨어이다. 응용 소프트웨어 (서버 - 클라이언트) 간의 데이터 통신을 위한 소프트웨어라고 생각하면 쉽다. 구체적으로 들어가면 AMQP를 구현한 구현체이고, STOMP, MQPP와 같은 프로토콜을 지원하기 위해 확장되고 있다.
AMQP는 Advanced Message Queuing Protocol, 즉 메세지 큐를 이용하여 인스턴스끼리 데이터를 교환하는 프로토콜을 의미한다.
AMQP의 구조는 위 이미지와 같다.
여기까지가 AMQP가 가지고 있는 기본 구조이다. 아래의 내용들은 RabbitMQ가 가진 특성들과 속성들이다.
Exchange는 다음과 같은 속성을 가진다.
Queue는 다음과 같은 속성을 가진다.
amq.
은 예약어로 사용 불가Exchange에서 메시지를 어떤 큐로 어떻게 전달할 것인지를 결정하는 타입은 크게 네 가지로 분류됩니다. 보통은 라우팅 키를 이용하여 Queue에 매칭하고, Header와 Fanout의 경우에만 특수하게 다르다.
타입 | 설명 |
---|---|
Direct | 라우팅 키가 정확히 일치하는 Queue에 메시지 전송 |
Topic | 라우팅 키 패턴이 일치하는 Queue에 메시지 전송 ( “#”은 0개 이상의 단어를 대체한다. ) |
Headers | [key:value]로 이루어진 header값을 기준으로 일치하는 Queue에 메시지 전송 |
Fanout | 해당 Exchange에 등록된 모든 Queue에 메시지 전송 |
Direct와 Topic Type, Fanout은 매우 직관적이라 별도의 설명이 필요하지 않을 것 같다.
Header Type만 살펴보자.
Headers Type은 Producer에서 생성한 header의 key-value 쌍과 Queue가 가지고 있는 Argument의 key-value 쌍과 일치하면 binding 된다.
Headers Type을 설정하면 라우팅 키는 무시된다.
x-match라는 특정 인수를 사용하여 key-value의 일치에 대한 옵션을 지정할 수 있는 데 default 값으로 all이 설정된다.
key | value | 설명 |
---|---|---|
x-match | all | header의 모든 key-value 쌍 값과 argument의 모든 key-value 쌍 값이 일치해야 binding 된다. |
x-match | any | argument의 key-value 쌍 값 중 하나라도 header의 key-value 쌍 값과 일치하는 쌍이 존재하면 binding 된다. |
기본적으로 Exchange Type은 unnamed pre-declared direct exchange으로 지정된다. 빈 문자열이 사용되고, 모든 Queue가 Exchange에 연결될 것이다.
WebSocket에 대해서 공부하게 되면서 AMQP와 구현체인 RabbitMQ에 대해서 알아봤다. WebSocket 구현에서 STOMP, RabbitMQ, AMQP를 한 번에 공부하다보니 헷갈리는 것들이 이만저만이 아니다.. 다음글에서도 이것들을 정리해보는 시간을 가져보자.
RabbitMQ Exchange Types: 6 Categories Explained Easy - Learn | Hevo
[RabbitMQ] 기초 개념
[Spring] macOS M1에서 Spring Cloud Gateway 에러 해결법
좋은 글 감사합니다.