[WebSocket] RabbitMQ, AMQP

DevHwan·2023년 8월 2일
0
post-thumbnail

들어가며

최근에 웹 소켓을 이용하여 실시간 통신 및 비동기 통신을 공부하면서 메시지 브로커 소프트웨어인 RabbitMQ를 사용하게 되었다. RabbitMQ에 대하여 자세히 알아보면서 해당 글을 작성하게 되었다. 해당 글을 읽게 되는 사람들도 나와 비슷한 이유이지 않을까 싶다.

RabbitMQ는 뭔데요?

RabbitMQ는 쉽게 말하면 오픈 소스 메시지 브로커 미들웨어이다. 응용 소프트웨어 (서버 - 클라이언트) 간의 데이터 통신을 위한 소프트웨어라고 생각하면 쉽다. 구체적으로 들어가면 AMQP를 구현한 구현체이고, STOMP, MQPP와 같은 프로토콜을 지원하기 위해 확장되고 있다.

AMQP는 또 뭔데요..?

AMQP는 Advanced Message Queuing Protocol, 즉 메세지 큐를 이용하여 인스턴스끼리 데이터를 교환하는 프로토콜을 의미한다.

AMQP의 구조는 위 이미지와 같다.

  • Producer : Message를 보내는 주체, 보내고자 하는 Message를 Exchange에 publish한다.
  • Exchange : Producer로 부터 전달받은 메세지를 Queue에게 전달한다. 어떤 Queue에게 어떤 방식으로 전달할지를 결정하고 4가지 타입으로 분류된다.
  • Bound(Binding) : Exchange와 Queue의 관계, 보통은 특정 Exchange가 특정 Queue와 Binding되도록 정의된다. ( 전체전송하는 특정 타입을 제외하고 )
  • Queue : Message가 Consumer에게 전달되기 전 보관되는 장소
  • Consumer : Message를 Producer에게 전달받아 처리하는 주체이다.

여기까지가 AMQP가 가지고 있는 기본 구조이다. 아래의 내용들은 RabbitMQ가 가진 특성들과 속성들이다.

Exchange 속성

Exchange는 다음과 같은 속성을 가진다.

  • Name: Exchange 이름
  • Type: 메시지 전달 방식
  • Durability: 브로커가 재 시작되었을 때, 삭제여부
    • Durable: 브로커가 재 시작되어도 삭제되지 않는다.
    • Transient: 브로커가 재 시작되면 제거된다.
  • Auto-delete: 마지막 Queue 연결이 해제되면 삭제된다.
  • Internal : 예를 선택하는 경우 해당 Exchange에 직접적으로 메시지를 publish할 수 없고, 오직 binding 교환에만 사용된다.

Queue 속성

Queue는 다음과 같은 속성을 가진다.

  • Name: Queue 이름, amq.은 예약어로 사용 불가
  • Durability: 브로커가 재시작될 때 남아있는지 여부
    • Durable: 브로커가 재시작되어도 디스크에 저장되어 남아있음
    • Transient: 브로커가 재시작되면 사라짐
  • Auto delete: 마지막 Consumer가 consume을 끝낼 경우 자동 삭제

AMQP 수신 확인 모델

  1. Consumer가 메시지를 받아서, MQ에 알리고 MQ는 이를 확인하여 Queue에서 해당 메시지를 제거한다.
  2. MQ에서 Message를 보낸 후 자동으로 제거한다.

Exchange 타입

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

Headers Type은 Producer에서 생성한 header의 key-value 쌍과 Queue가 가지고 있는 Argument의 key-value 쌍과 일치하면 binding 된다.

Headers Type을 설정하면 라우팅 키는 무시된다.

x-match라는 특정 인수를 사용하여 key-value의 일치에 대한 옵션을 지정할 수 있는 데 default 값으로 all이 설정된다.

keyvalue설명
x-matchallheader의 모든 key-value 쌍 값과 argument의 모든 key-value 쌍 값이 일치해야 binding 된다.
x-matchanyargument의 key-value 쌍 값 중 하나라도 header의 key-value 쌍 값과 일치하는 쌍이 존재하면 binding 된다.

Default Exchange Type

기본적으로 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 에러 해결법

profile
달리기 시작한 치타

1개의 댓글

comment-user-thumbnail
2023년 8월 2일

좋은 글 감사합니다.

답글 달기