반응형
RabbitMQ에서 Exchange는 메시지를 큐로 라우팅 하는 역할을 합니다. 메시지가 먼저 Exchange로 전달되고, Exchange는 메시지를 적절한 큐에 분배합니다. RabbitMQ는 다양한 Exchange 유형을 제공하며, 각 유형은 메시지를 큐로 라우팅 하는 방식이 다릅니다.
RabbitMQ의 Exchange 종류
- Direct Exchange
- Fanout Exchange
- Topic Exchange
- 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는 바인딩된 큐의 라우팅 패턴과 메시지의 라우팅 키를 비교하여 일치하는 큐로 메시지를 전달.
- 예시 :
queue1
은error.#
로 바인딩되고,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는 더 복잡한 헤더 기반 조건부 라우팅이 필요할 때 유용합니다.
반응형
'Linux' 카테고리의 다른 글
[Linux] 시스템 로그 관리 방법 logrotate (9) | 2024.10.30 |
---|---|
[linux] rabbitMQ 알아보기 (0) | 2024.10.01 |
[linux] libvirt - 가상화 환경 관리하기 (0) | 2024.09.26 |
[lvm] 스토리지 관리 (PV, VG, LV) (0) | 2024.08.25 |
[HA] 고가용성 클러스터를 위한 pacemaker와 corosync (1) | 2024.08.19 |