티스토리 뷰

JAVA/JAVA기본

RabbitMQ란?

realizers 2022. 6. 14. 11:48
728x90
반응형

RabbitMQ란?


RabbitMQ는 AMQP 프로토콜을 구현한 메세지 브로커입니다. 생산자에게 메시지를 생산하여 소비자에게 전달해주는 서비스로 시스템 간 메시지를 전달해주는 오픈소스 메시지 브로커 소프트웨어입니다.

 

 

기본적인 구조


  1. Producer가 Exchange에게 메시지를 발행합니다.
  2. Exchange는 Binding 규칙을 사용해 메시지의 복사본을 Queue에 배포합니다. 실제 메시지를 큐에 넣는 대신 메시지에 대한 참조가 Queue에 추가됩니다. 메시지를 전달할 준비가 되면 이 참조를 사용해 클라이언트에게 전송합니다. 메시지가 여러 클라이언트에게 발행될 때 참조만을 저장해서 메모리를 적게 사용합니다.
  3. Broker는 subscribe하고 있는 Consumer에게 메시지를 전달하거나 요청시 Queue에서 메시지를 fetch하거나 pull합니다.

 

💡 Producer

  • Producer는 Message를 Consumer에게 전달하기 위해 Message를 Exchane에 전달하는 역할을 합니다.
  • Producer는 Message를 전달하는 일 이외에는 아무런 일도 하지 않습니다.

💡 Exchange

  • Exchange는 Producer에서 전달받은 Message를 Queue에 차곡차곡 넣습니다.
  • Exchange는 Message를 어떤 Queue에 넣을지, 버릴지는 Exchange 규칙에 의해 결정됩니다.

💡 Binding

  • Exchange와 Queue의 관계를 말하며, 바인딩되어야 Exchange가 Queue에게 Message를 전달합니다.
  • 특정 조건에 맞는 Message를 특정 Queue에 전송할 수 있도록 설정할 수 있는데 이는 Exchane 타입에 맞게 설정되어야 합니다. 

💡 Queue

  • Queue는 전달 받은 Message들을 연결된 Consumer에게 전달하며 병령 처리 방식으로 나누어 줍니다.

💡 Consumer

  • Consumer는 Producer로부터 Message를 받아 처리하는 역할을 수행합니다.

💡 Message Durability

  • 생산자를 통해서 메시지를 Queue에 넣은 다음에 소비자에게 전달하기 전 RabbitMQ 서버가 죽는다면 Queue에 존재하던 데이터들은 소멸하게 됩니다. 이러한 문제를 해결하기 위해서 영속성이란 개념을 가지고 있습니다.
  • Message Durability는 메시지가 Queue에 저장될 때, disk의 파일에도 동시에 저장하는 방법입니다. 해당 방법을 사용하면 서버가 죽었을 경우 Queue의 데이터가 어느정도 복구가 되지만 메시지가 disk의 파일에 쓰는 도중 서버가 죽는 경우에 있어서는 일부 데이터 손실이 발생할 수 있습니다.
  • RabbitMQ가 재시작될 때 남아 있는지 여부
    • durable : 재시작해도 유지가능(메시지를 발급할때 PERSISTENT_TEXT_PLAIN옵션을 주어야 Message가 보존됩니다.)
    • transient : 재시작하면 사라짐

 

Exchange 종류


💡 Fanout

  • 해당 Exchange에 등록된 모든 Queue에 Message를 전송합니다.
  • BroadCast의 특징을 가집니다.

💡 Direct

  • 각 Queue는 Routing Key에 Binding이 되어 있으며, Exchange에 Routing Key가 들어오면 해당 Exchange에 Binding 되어 있는 Queue중에서 해당 Key와 매핑되어 있는 Queue로 Message를 보내게 됩니다.
  • UniCast의 특징을 가집니다.

💡 Topic

  • Topic은 Direct보다 조금 더 유연하게 바인딩 규칙을 정의할 수 있습니다.
  • Direct와 같이 Routing Key를 가지지만 Topic은 마침표를 이용하여 여러개의 단어를 사용할 수 있습니다.(최대 255Byte)
  • Direct와 비슷하게 보이지만 Publish할 때 설정되는 Routing Key는 바인딩할 때 설정되는 Routing Key와 완벽히 일치해야 합니다.
  • Topic은 Routing Key 문자열 내 *, #을 사용하여 유연하게 바운딩할 수 있습니다.
    • * - 단어 한개를 대체합니다.
    • # - 0개 이상의 단어를 대체합니다.
  • MuitiCast의 특징을 가집니다.

 

💡 Headers

  • Headers는 Producer측에서 정의된 header의 key-value쌍과 Consumer측에서 정의된 argument의 key-value쌍과 일치하면 바인딩됩니다.
  • Producer측에서 정의하는 header는 Message와 함께 전달하며 Consumer측에서는 Exchange와 Queue를 바인딩하는 시점에 argument를 정의합니다.
  • MultiCast의 특징을 가집니다.

Key Value 설명
x-match all header의 모든 key-value쌍 값과 argument의 모든 key-value쌍 값이 일치해야 바인딩됩니다.
x-match any argument의 key-value쌍 값 중 하나라도 header의 key-value쌍 값과 일치하는 값이 있으면 바인딩됩니다.

 

 

 

 

참고)

https://hwannny.tistory.com/82

https://blog.dudaji.com/general/2020/05/25/rabbitmq.html

https://co-de.tistory.com/9

https://lob-dev.tistory.com/entry/RabbitMQ-Message-Queue-%EB%B0%8F-Message-%EB%B3%B4%EC%A1%B4-%EC%84%A4%EC%A0%95%EA%B3%BC-Fair-Dispatch

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/

 

 

 

 

 

 

 

 

728x90
반응형

'JAVA > JAVA기본' 카테고리의 다른 글

Java Thread Deep Dive  (0) 2024.03.03
자바에서 교착상태  (0) 2023.03.29
JAVA - Blocking vs Non-Blocking & Sync vs Async  (0) 2022.06.05
JAVA - String Constant Pool이란  (0) 2022.05.15
JAVA - 람다식이란?  (0) 2022.02.10