beomsic 2023. 1. 4. 00:48

Rabbit MQ 란 ❓


💡 AMQP (Advanced Message Queing Protocol, MQ 표준 프로토콜)을 따르는 여러 오픈소스 메시지 브로커중 하나

Producer 에서 Consumer로 메시지(요청)를 전달할 때 중간에서 브로커 역할을 한다.

 

사용 케이스

  • 요청을 많은 사용자에게 전달
  • 요청에 대한 처리 시간이 길때
  • 많은 작업이 요청되어 처리를 해야할 때
  • 요청을 다른 API에게 위임하고 빠른 응답을 할 때

 

메시지 브로커

💡 메시지 브로커는
    - 클라우드 네이티브
    - 마이크로서비스 기반
    - 서버리스 및 하이브리드 클라우드 아키텍처
    를 지원하기 위한 공통 통합 메커니즘을 구축하는데 도움이 되는 애플리케이션간 통신 기술이다.
  • 메시지 브로커는 애플리케이션, 시스템 및 서비스가 서로 간에 통신하고 정보를 교환할 수 있도록 해주는 소프트웨어입니다
  • 정규 메시징 프로토콜 간에 메시지를 변환함으로 써 이를 수행

 

메시지 브로커는 메시징 미들웨어 또는 MOM(메시지 지향 미들웨어) 솔루션 내의 소프트웨어 모듈이다.

  • 메시지를 검증, 저장, 라우팅하고 이를 적절한 대상에 전달
  • 다른 애플리케이션 간의 중개자 역할

 

수신자가 활성인지에 대한 여부, 수신자의 수를 몰라도 송신자가 메시지를 발행할 수 있도록 허용한다.

⇒ 시스템 내에서 프로세스와 서비스의 디커플링이 용이

 

메시지 브로커는 송신 서비스가 수신 서비스의 응답을 기다릴 필요가 없게 서비스 간의 비동기 통신이 가능하도록 한다.

 

메시지 브로커 모델

✔️ 포인트-투-포인트 메시징

  • 메시지의 송신자와 수신자간에 일대일 관계를 지닌 메시지 대기열에서 사용하는 분배패턴
  • 큐의 각 메시지는 하나의 수신자에게 전송, 오직 한 번만 이용
  • 메시지가 한 번만 실행되어야 하는 경우 호출
    • ex) 급여 및 재무 트랜잭션

✔️ 발행 / 구독 메시징

  • 메시지의 생성자는 이를 토픽에 발행, 다수의 메시지 이용자는 해당 메시지를 수신하고자 하는 토픽을 구독한다.
  • 토픽에 대해 발행된 모든 메시지는 이를 구독한 모든 애플리케이션에 분배
  • 발행자와 이용자 사이에 일대다 관계가 있는 브로드캐스트 스타일의 분배 방법

 

📌 구조 / 중요 개념


📖 Message

처리해야할 내용

 

📖 Producer

요청을 보내는 주체

Producer는 message를 consumer에게 위임하기 위해 message를 exchange에 publish 한다.

message를 보내는 일만 수행한다.

 

📖 Consumer

message를 producer로 부터 위임받아 처리한다.

 

📖 Exchange

producer에서 전달받은 message를 queue에 전달해준다.

  • 메시지를 어떤 queue에 추가할지?
  • 얼마나 추가할지?
  • 그냥 버려야할지?

⇒ exchange 규칙에 의해 결정

 

exchange 여러 타입

  1. Fanout
    • exchange와 binding 된 모든 queue에 동일한 message를 보낸다.
  2. Direct
    • exchange와 message를 보낼 queue를 routing key를 통해 직접 선택해 binding할 수 있다.
    • 즉, 라우팅해서 보낼 수 있다.
  3. Topic
    • direct 타입보다 더 유연하게 binding 규칙을 정의할 수 있다.
    • direct 타입과 같은 routing key를 사용하되 topic 타입은 마침표로 구분되는 단어들을 사용
    • 문자열 내 *, # 를 삽입시켜 유연한 binding을 제공
      •  * - 단어 한개를 대체
      •  # - 0개 이상의 단어를 대체
      •  
  4. Headers
    • producer 측에서 정의된 header의 key-value 쌍과 consumer 측에서 정의된 argument의 key-value 쌍과 일치되면 binding 된다.
    • producer 측에서 정의하는 header는 message와 함께 publish 된다.
    • consumer 측에서는 exchange와 queue를 binding 하는 시점에 argument를 정의한다.

 

📖 Queue

Exchange는 producer로 부터 전달받은 message를 binding되는 queue들에게 동일하게 전달

queue는 전달받은 message들을 연결된 consumer들에게 공평하게 Roud-Robin 스케줄링 방식으로 나누어 준다.

 

📖 Binding

Exchange 와 Queue의 관계

  • binding 되어야 exchange가 queue에게 message를 전달한다.

보통은 사용자가 어느 exchange가 어느 queue를 binding할지 정의한다.

  • fanout - 예외

 

참고자료

https://www.rabbitmq.com/

https://www.ibm.com/kr-ko/cloud/learn/message-brokers

https://velog.io/@sdb016/RabbitMQ-기초-개념

https://hwannny.tistory.com/82