RabbitMQ는 Queue, Exchange, Message라는 세 가지 주요 개념을 사용하며, 이들의 역할과 상호작용을 이해하는 것이 중요합니다. 본 블로그에서는 이러한 개념을 자세히 설명하고 실제 사례를 통해 어떻게 활용되는지 알아보겠습니다.

Queue 종류

자동삭제 큐

queue_auto_del

  • 소비자가 모두 제거(채널 종료)되면 큐도 삭제됨
  • 소비자의 수는 제한 없음

독점 큐

queue_monopoly

  • 소비자가 제거(채널 종료)되면 큐도 삭제됨
  • 단일 소비자만 허용

자동 만료 큐

queue_ttl

  • 큐가 미사용 상태(소비자가 없거나, 메세지 요청이 없는) 가 TTL 로 지정된 시간동안 지속되면 큐 삭제

영구적인 큐

queue_perm

  • Queue.Delete 명령 호출 전까지 유지됨
  • 서버 재시작시에도 메세지 유지됨
  • 메세지의 만료(x-message-ttl) 지정 가능
  • 메세지의 최대 보관 개수(x-max-length) 지정 가능

Exchange

Exchange 란?

  • 메세지 브로커에서 큐에 메세지를 전달하는 컴포넌트
  • 메세지 데이터/속성을 분석하여 메세지에 라우팅 동작을 정의할 수 있다.
  • RabbitMQ 내에 서로다른 라우팅 동작을 처리하는 여러 유형의 Exchange 가 존재
  • (플러그인을 사용해) 커스텀 Exchange 정의 가능

Exchange 유형 : exchange_type = direct

exchange_direct

  • routinng-key 에 바인딩된 모든 queue 에 메세지를 전달한다

Exchange 유형 : exchange_type = fanout

exchange_fanout

  • Exchange 에 바인딩된 모든 queue 에 메세지를 전달한다
  • routing-key를 확인할 필요가 없다 —> 성능 향상

Exchange 유형 : exchange_type = topic

exchange_topic

  • routing-key 에 매칭되는 패턴에 Bind 되어있는 큐로 메세지가 전송된다.

Exchange 유형 : exchange_type = x-consistent-hash

exchange_hash

  • 메세지의 routing-key 또는 ‘hash-header’ 로 지정된 header의 값을 hash 하여 여러 큐에 분산 (load-balance)
  • 큐에 가중치를 설정하여 load-balance 정도를 조절할 수 있음
  • RabbitMQ 에서 plugin 형식으로 배포되는 Exchange

Reject Message 처리

reject_msg_proc

  • requeue 플래그가 설정된 경우, 거부된 메세지가 다시 큐로 들어간다
  • x-dead-letter-exchange 가 설정되어있는 경우, 거부된 메세지는 dead letter exchange 로 라우팅되고, 연동된 큐로 들어가게 된다
  • (rpc 응답) Basic.Reject : 한번에 하나의 메세지만 거부 가능 (AMQP 스펙)
  • (rpc 응답) Basic.Nack : 한번에 여러 메세지 거부 가능

결론

RabbitMQ의 Queue, Exchange, Message는 분산 시스템에서 메시지 전달을 효율적으로 처리하기 위한 핵심 요소입니다. Queue는 메시지를 일시적으로 저장하는 버퍼 역할을 하며, Exchange는 메시지를 적절한 Queue로 라우팅합니다. Message는 애플리케이션 간에 전달되는 실제 데이터입니다. 이들의 상호작용을 통해 메시지 브로커는 안정적이고 확장 가능한 메시징 시스템을 구축할 수 있습니다. RabbitMQ의 기능과 개념을 잘 이해하면 분산 시스템의 복잡성을 줄이고 메시지 전달의 효율성을 높일 수 있습니다.

태그:

카테고리:

업데이트:

댓글남기기