무지개곰
article thumbnail
반응형

RabbitMQ에서 Exchange는 메시지를 큐로 라우팅 하는 역할을 합니다. 메시지가 먼저 Exchange로 전달되고, Exchange는 메시지를 적절한 큐에 분배합니다. RabbitMQ는 다양한 Exchange 유형을 제공하며, 각 유형은 메시지를 큐로 라우팅 하는 방식이 다릅니다.


RabbitMQ의 Exchange 종류

  1. Direct Exchange
  2. Fanout Exchange
  3. Topic Exchange
  4. Headers Exchange

각각의 Exchange에 대해 자세히 설명하면 다음과 같습니다:

Direct Exchange

  • 설명: Direct Exchange는 메시지를 정확히 일치하는 라우팅 키(Routing Key)를 사용하는 큐로 전달합니다. 프로듀서가 메시지를 전송할 때 특정 라우팅 키를 함께 보내고, 큐는 이 라우팅 키와 일치하는 메시지만 수신합니다.
  • 사용 예시: 특정한 작업 또는 이벤트를 특정 큐로만 보내고 싶을 때 사용됩니다.
  • 예시 상황: 로그 시스템에서, 특정 서버의 로그만 특정 큐에 보내고 싶다면 해당 서버의 이름을 라우팅 키로 지정하여 로그 메시지를 전달할 수 있습니다.
  • 동작 방식 :
    • 프로듀서가 메시지와 함께 라우팅 키를 Direct Exchange로 전송.
    • Exchange는 바인딩된 큐들의 라우팅 키와 메시지의 라우팅 키를 비교하여 일치하는 큐로만 메시지를 전달.
  • 예시 :
    • queue1이 라우팅 키 error로 바인딩된 상태에서, 프로듀서가 error 키로 메시지를 전송하면 queue1이 메시지를 받습니다.

CLI 명령

//Direct Exchange 생성
rabbitmqctl add_exchange direct <exchange_name>

//Queue 생성
rabbitmqctl add_queue <queue_name>

//Queue를 Exchange에 바인딩
rabbitmqctl bind_queue <queue_name> <exchange_name> <route_key>

Fanout Exchange

  • 설명: Fanout Exchange는 라우팅 키와 관계없이 모든 바인딩된 큐로 메시지를 브로드캐스트 합니다. 즉, 이 Exchange에 메시지가 들어오면 바인딩된 모든 큐로 동일한 메시지를 보냅니다.
  • 사용 예시: 모든 수신자에게 메시지를 무조건 보내야 할 때 사용됩니다.
  • 예시 상황: 채팅 애플리케이션에서, 새로운 채팅 메시지가 들어올 때 모든 사용자에게 동일한 메시지를 전송해야 하는 경우에 Fanout Exchange를 사용합니다.
  • 동작 방식 :
    • 라우팅 키를 사용하지 않고, Fanout Exchange에 연결된 모든 큐로 메시지를 전달.
  • 예시 :
    • queue1, queue2, queue3가 Fanout Exchange에 바인딩된 경우, 프로듀서가 메시지를 보내면 세 큐 모두 메시지를 받습니다.

CLI 명령

//Fanout exchange 생성
rabbitmqctl add_exchange fanout <exchange_name>

//Queue 생성
rabbitmqctl add_queue <queue_name1>
rabbitmqctl add_queue <queue_name2>

//Queue를 Exchange에 바인딩
rabbitmqctl bind_queue <queue_name1> <exchange_name> ""
rabbitmqctl bind_queue <queue_name2> <exchange_name> ""

Topic Exchange

  • 설명: Topic Exchange는 와일드카드 패턴을 사용하여 라우팅 키를 기반으로 메시지를 큐로 전달합니다. .(점)으로 구분된 라우팅 키를 사용하며, *# 와일드카드를 지원합니다.
    • *: 단일 단어 와일드카 - user.*의 경우 user.signup, user.login과 단일 단어만 매핑
    • #: 다중 단어 와일드카드 - user.# 의 경우 user.signup, user.profile.view 모두 매핑
  • 사용 예시: 다양한 조건에 따라 메시지를 큐로 라우팅해야 할 때 사용됩니다.
  • 예시 상황: 뉴스 애플리케이션에서, 주제별로 뉴스를 구분하여 구독하는 경우. 예를 들어, sports.#는 스포츠 관련 모든 뉴스를 받지만, sports.football은 축구 관련 뉴스만 받도록 설정할 수 있습니다.
  • 동작 방식 :
  • 프로듀서가 라우팅 키와 함께 메시지를 전송하면, Exchange는 바인딩된 큐의 라우팅 패턴과 메시지의 라우팅 키를 비교하여 일치하는 큐로 메시지를 전달.
  • 예시 :
  • queue1error.#로 바인딩되고, queue2*.critical로 바인딩된 경우, 라우팅 키가 error.database인 메시지는 queue1으로, 라우팅 키가 system.critical인 메시지는 queue2로 전달됩니다.

CLI 명령

//Topic Exchange 생성
rabbitmqctl add_exchange topic <exchange_name>

//Queue 생성
rabbitmqctl add_queue <queue_name>

//Queue를 Exchange에 바인딘
rabbitmqctl bind_queue <queue_name> <exchange_name> "topic.#"

Headers Exchange

  • 설명: Headers Exchange는 라우팅 키 대신 메시지 헤더에 기반하여 큐로 메시지를 라우팅 합니다. 헤더에 정의된 값과 Exchange에 설정된 조건이 일치할 경우에만 메시지를 큐로 전달합니다. x-match 속성에 따라 모든 헤더 일치(all) 또는 일부 헤더 일치(any) 조건을 설정할 수 있습니다.
  • 사용 예시: 메시지의 특성(헤더)에 따라 조건부로 메시지를 전달해야 할 때 사용됩니다.
  • 예시 상황: 사용자 맞춤형 메시지 전달 시스템에서, 사용자별로 각기 다른 헤더 값에 따라 메시지를 전달하는 경우.
  • 동작 방식 :
    • 프로듀서가 메시지를 헤더와 함께 전송하면, Headers Exchange는 해당 헤더의 값이 조건에 맞는 큐로 메시지를 전달.
  • 예시 :
    • queue1은 헤더 type=error로 설정되고, queue2는 헤더 loglevel=critical로 설정된 경우, 헤더가 type=error, loglevel=critical인 메시지는 두 큐로 모두 전달될 수 있습니다.

CLI 명령

//Exchange 생성
rabbitmqctl add_exchange <exchange_name>

//Queue 생성
rabbitmqctl add_queue <queue_name>

//Queue를 Exchange에 바인딩
rabbitmqctl bind_queue <queue_name> <exchange_name> "" '{"x-match":"all","header1":"value1","header2":"value2"}'

각 Exchange의 비교 정리

Exchange 종류 라우팅 방식 라우팅 키 사용 사용 예시
Direct 정확한 라우팅 키 일치 사용 특정 이벤트나 작업에 대해 해당하는 큐에만 메시지를 보내고 싶을 때. 예: 특정 서버의 로그만 전달.
Fanout 모든 바인딩된 큐로 브로드캐스트 사용 안 함 모든 수신자에게 동일한 메시지를 보낼 때. 예: 채팅 애플리케이션에서 모든 사용자에게 메시지 전송.
Topic 와일드카드를 사용한 라우팅 키 패턴 매칭 사용 주제 기반 메시지 전달. 예: 뉴스 시스템에서 sports.#는 모든 스포츠 뉴스를 받지만, sports.football은 축구 뉴스만 수신.
Headers 메시지 헤더 값에 따라 라우팅 사용 안 함 메시지의 특성(헤더)에 따라 맞춤형으로 메시지를 라우팅. 예: 특정 유형의 사용자에게만 메시지 전달.

각각의 Exchange는 시스템 요구 사항에 따라 적절히 선택해 사용됩니다. Direct는 간단하고 명확한 라우팅이 필요할 때, Fanout은 브로드캐스트 방식이 필요할 때, Topic은 패턴 기반 라우팅이 필요할 때, Headers는 더 복잡한 헤더 기반 조건부 라우팅이 필요할 때 유용합니다.

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!