RabbitMQ ‐ RabbitMQ 기본 개념 - dnwls16071/Backend_Study_TIL GitHub Wiki

📚 AMQP(Advanced Message Queing Protocol)

스크린샷 2025-02-03 오전 1 38 56

  • AMQP를 구현한 오픈소스 메시지 브로커이다.
  • Producer에서 메시지를 발행하고 Consumer에서 메시지를 처리하는데 이 중간에서 브로커 역할을 한다.

📚 RabbitMQ 구성 컴포넌트 용어 정의

  • Producer(생산자)
    • 메시지를 생성하고 RabbitMQ에 전송하는 애플리케이션
    • Producer는 특정 Exchange에 메시지를 전송하고 Exchange는 메시지를 라우팅하여 큐에 배치
  • Exchange
    • Producer로부터 받은 메시지를 큐에 전달
    • Exchange 유형
      • Direct : 특정 라우팅 키와 정확히 일치하는 큐에 메시지를 전송
      • Fanout : 모든 큐에 메시지를 브로드캐스트
      • Topic : 라우팅 키 패턴을 기반으로 메시지를 특정 큐에 전달
      • Headers : 메시지 헤더 속성에 따라 메시지를 라우팅
    • 메시지가 Exchange로 전송될 때 Routing Key가 함께 전달
  • Routing Key(라우팅 키)
    • 메시지를 전송할 때 Producer가 Exchange에 전달하는 키
    • Exchange는 이 Routing Key를 참고하여 어떤 큐에 메시지를 전달할지 결정
  • Queue(큐)
    • 메시지를 일시적으로 저장하는 버퍼 역할, RabbitMQ의 큐는 FIFO 방식으로 동작하며 메시지가 소비자에게 전달될 때까지 보관
    • 각 큐는 여러 Consumer가 구독할 수 있으며 메시지는 큐에 들어온 순서대로 전달
    • 비동기적으로 동작하며 여러 컨슈머가 메시지를 수신할 수 있다. 단 하나의 메시지가 여러 소비자에게 중복으로 전달될 수는 없음
    • 동일한 메시지를 수신하려면 Fanout Exchange 방식으로 동작해야만 함
  • Binding
    • exchange와 큐의 관계
    • 바인딩은 메시지를 라우팅할 때 어떤 조건으로 큐에 보낼지 정의하고 이를 위해 binding Key가 사용됨
    • Binding Key와 Routing Key가 일치하면 해당 큐로 메시지 전달
  • Consumer(소비자)
    • 큐에서 메시지를 가져와 처리하는 애플리케이션
    • RabbitMQ는 여러 소비자에게 메시지를 로드밸런싱할 수 있다.
    • Consumer는 큐에서 메시지를 받아 처리하면 메시지에 대한 확인을 브로커에 전송함
    • 확인을 보내지 않으면 브로커는 메시지를 재전송하거나 설정한 다른 Consumer에게 전송한다.
  • Message Acknowledgment(메시지 확인)
    • 메시지가 성공적으로 처리되었음을 RabbitMQ에 알리는 과정
    • 소비자가 메시지를 성공적으로 처리하지 못했다면 메시지를 다시 큐에 넣어 다른 소비자가 처리하도록 할 수 있다.
  • Prefetch Count(프리페치 카운트)
    • 소비자가 받을 수 있는 최대 메시지 수를 설정
    • 한 번에 많은 양의 메시지를 처리하지 않도록 하여 소비자 성능 최적화
  • Virtual Host(가상 호스트)
    • RabbitMQ 서버 내의 논리적인 구획으로 메시지 큐, 익스체인지, 사용자 권한 등을 구분
    • 하나의 RabbitMQ 서버 내에 여러 개의 가상 호스트를 설정하여 서로 다른 애플리케이션의 메시지를 격리
  • Dead Letter Queue(DLQ)
    • 메시지가 처리되지 못하거나 유효 기간이 지난 경우 별도의 큐로 이동하는 구조도 설정

📚 Exchange 유형에 따른 처리 흐름

[ Direct Exchange ]

스크린샷 2025-02-06 오후 1 38 07

  • Direct Exchange는 메시지가 라우팅 키에 따라 특정 큐로 하나씩 전달되는 방식이다.
  • 메시지를 발행할 때 사용하는 라우팅 키와 동일한 키로 익스체인지에 바인딩된 모든 큐에 메시지를 전달한다.

[ Topic Exchange ]

  • 라우팅 키를 패턴 기반으로 정의하여 메시지를 여러 큐에 유연하게 전달할 수 있는 방식이다.
  • 와일드카드 매칭을 사용하여 복잡한 라우팅도 가능하다.

[ Fanout Exchange ]

  • 브로드캐스트(단일 송신자가 다수의 수신자에게 전송) 방식으로 메시지를 모든 바인딩된 큐에 전달한다.
  • 한 번의 메시지 발행으로 모든 큐가 동일한 메시지를 받는다.

📚 메시지 전송 단계별 프로세스

스크린샷 2025-02-06 오후 1 40 57

  • Producer → Broker
    • Producer가 RabbitMQ Broker에 메시지를 송싱한다.
    • 이 때, 메시지는 큐에 저장되며 익스체인지와 바인딩 설정에 따라 적절한 큐로 라우팅이 된다.
  • Broker → Consumer
    • Broker는 큐에 있는 메시지를 Consumer에게 전달한다.
    • 큐에서 메시지를 가져가거나 메시지를 푸시받는 방식으로 수신
  • 메시지 확인 또는 거절
    • ACK : Consumer가 메시지를 성공적으로 처리한 후 Broker에게 ACK를 전송
    • NACK : Consumer가 메시지 처리에 실패하거나 메시지를 거절한 후 NACK를 전송
    • NACK에는 메시지를 다시 큐로 보내야 할지 또는 폐기해야 할지 설정 가능
  • Producer에 응답을 보내기
    • Producer가 Publisher Confirms를 활성화한 경우, Broker가 ACK 또는 NACK 결과를 Producer에게 전송
    • ACK를 받은 경우 메시지가 성공적으로 소비된 것으로 간주, NACK를 받은 경우 메시지 실패를 기록하거나 재전송