티스토리 뷰
서론
본 글에서는 Message Broker 중 실시간 메시지 처리에 최적화 및 현재 인기가 많은 RabbitMQ에 대하여 실제 적용해 보며 느꼈던 교환 유형에 대한 중요성을 정리하고자 합니다.
그러므로 이 글에서는 RabbitMQ가 무엇인지에 대한 이야기를 다루기 보단, 그 뒤의 구체적인 교환(Exchange) 유형 방식에 대한 내용에 초점을 두고 있습니다.
RabbitMQ는 총 4가지 유형의 Exchange Type이 존재합니다. `Direct`,`Topic`,`Fanout`,`Headers` 각 교환 유형에는 다른 매개변수와 바인딩 설정을 사용하여 메시지를 다르게 라우팅 하게 됩니다.
1. Direct Exchange (직접 교환)
직접 교환의 라우팅은 간단합니다. 메세지는 바인딩 키가 메시지의 라우팅 키와 정확하게 일치하는 큐로 이동하게 됩니다.
Direct Exchange는 간단한 문자열 식별자를 사용하여 동일한 교환에 게시된 메시지를 구별하는 데 유용합니다.
아래 예시를 통해 확인해 보겠습니다.
직접 교환 direct-create 와 이에 바인딩된 두 개의 대기열이 있다고 가정해 보겠습니다.
바인딩된 queue는 각각 서로 다른 Routing key를 가지게 됩니다.
- direct-create-queue는 direct-create-queue-test1라는 라우팅 키와 바인딩됩니다.
- direct-create-queue2는 direct-create-queue-test2라는 라우팅 키와 바인딩됩니다.
라우팅 키 direct-create-queue-test1로 설정하여 메시지를 전송해 보겠습니다.
위와 같이 라우팅 키 direct-create-queue-test1을 가진 Queue에 정상적으로 메시지가 전송된 것을 확인하였습니다.
그리고 direct-create-queue2에는 전송되지 않은 것을 알 수 있습니다.
메세지 라우팅 키가 어떤 바인딩 키와도 일치하지 않는다면 메시지는 삭제가 됩니다. 그리고 두 개 이상의 큐가 동일한 바인딩 키로 교환하도록 바인딩된 경우 Direct Exchange는 모든 일치하는 큐에 메시지를 전달하게 됩니다.
2. Topic Exchange(주제 교환)
Topic Exchange는 Direct Exchange와 유사하지만 라우팅은 라우팅 패턴에 따라 수행하기 됩니다.
고정 라우팅 키를 사용하는 대신 와일드카드를 사용하여 패턴을 구사하게 됩니다.
메시지는 메세지 라우팅 키와 패턴의 일치에 따라 하나 이상의 대기열로 라우팅 됩니다.
라우팅 키는 마침표 "."로 구분된 단어 목록으로 구성되어야 합니다.
예를 들어, 다음과 같은 라우팅 패턴이 있다고 가정하겠습니다.
- 채팅방. 채팅. 아이디
- 채팅방. 채팅. 이름
- 채팅방. 채팅. 닉네임
라우팅 패턴에는 라우팅 키의 특정 위치에 있는 단어와 일치하도록 별표("*")가 포함될 수 있습니다.
예를 들어, chat.*. room의 라우팅 패턴은 첫 번째가 chat으로 시작하고 마지막은 room으로 마무리되는 키와 일치된다는 의미입니다.
라우팅 패턴에는 0개 이상의 단어와 일치함을 의미하는 파운드 기호("#") 도 포함 될 수 있습니다.
예를 들어, chat.room.#의 라우팅 패턴은 chat.room으로 시작하는 모든 라우팅 키에 대하여 일치한다는 것을 의미합니다.
아래 예시를 통해 확인해 보겠습니다.
세 개의 대기열이 연결된 Topic Exchange가 있다고 가정하겠습니다.
topic-test-queue : 채팅방의 모든 로그를 수신하는 대기열입니다. 라우팅 패턴은 chat.room.log.# 을 사용하여 바인딩합니다.
topic-test-queue2 : 채팅방 기타 정보들에 대한 모든 정보를 수신하고자 합니다. 라우팅 패턴은 chat.room.*. etc를 사용하여 바인딩합니다.
topic-test-queue3 : 채팅방 관련 모든 정보를 수신하고자 합니다. 라우팅 패턴은 chat.room.#을 사용하여 바인딩합니다.
chat.room.log.#과 chat.room.*. etc에 대한 라우팅 키값으로 설정하여 메시지를 전송해 보겠습니다.
위의 이미지와 같이 chat.room.log.#으로 가지는 라우팅 키를 전송하였을 때 topic-test-queue와 topic-test-queue3에서만 메시지를 받은 것을 알 수 있습니다.
chat.room.nickname.etc 에 대한 정보를 전송한 결과입니다.
topic-test-queue2에서 메시지를 받는 것을 확인할 수 있습니다. chat.room.nickname.etc로 전달할지라도 chat.room.*. etc이기 때문에 와일드카드에 의해서 메시지를 받을 수 있다는 것을 알 수 있습니다.
3. Fanout Exchange(팬아웃 교환)
Fanout Exchange는 수신된 메시지를 라우팅 키나 패턴에 관계없이 바인딩된 모든 큐에 복사하고 라우팅합니다. 제공된 키는 무시됩니다.
Fanout Exchange는 동일한 메세지를 다양한 방식으로 처리할 수 있는 컨슈머가 있는 하나 이상의 대기열에 전송해야 하는 경우에 유용합니다.
예를 들어, 배달의 민족 또는 쿠팡이츠와 같이 주문 배달이 요청이 오게 된다면, 가게에도 알려야 하며, 배달하는 배달기사분들에게도 알려야 합니다. 그리고 주문 요청한 소비자에게도 알려야 합니다.
위와 같이 라우팅 키로 연결된 세 개의 큐가 있는 팬아웃 교환이 있다고 가정하겠습니다.
메시지는 deliver-exchange로 전송이 됩니다. 메세지는 모든 대기열인 deliver-order-queue, deliver-order-deliver-queue, deliver-order-customer-queue로 라운딩 됩니다. 모든 대기열에 키와 상관없이 전송이 되는 것을 확인할 수 있었습니다.
4.Headers Exchange(헤더 교환)
Headers Exchange는 헤더와 선택적 값을 포함하는 인수에 따라 메시지를 라우팅 합니다. 라우팅을 위해 메시지 헤더 속성을 사용합니다.
Exchange와 Queue 사이의 바인딩에 추가된 "x-match"라는 특수 인수는 모든 헤더가 일치해야 하는지 아니면 하나만 일치해야 하는지 지정합니다. "x-match" 속성은 "any" 또는 "all"의 두 가지 다른 값을 가질 수 있습니다.
여기서 "all"은 기본값입니다. "all"값은 모든 헤더 쌍(키, 값)이 일치해야 함을 의미하고, "any" 값은 헤더 쌍 중 적어도 하나가 일치해야 함을 의미합니다.
header_create_test 헤더 교환을 생성하고 여기에 3개의 큐를 바인딩해보겠습니다.
- headers-queue1은 format : pdf, type : report, x-match : all (모든 헤더 일치)
- headers-queue2은 format : pdf, type : log , x-match : any(하나라도 일치)
- headers-queue3은 format : zip , type : report , x-match : all(모든 헤더 일치)
Headers 값 조건은 format - pdf와 x-match - any로 하여 하나라도 일치할 경우 메시지를 받을 수 있도록 하였습니다.
위의 결과를 보게 된다면, headers-queue2에서만 메세지를 응답한 것을 확인할 수 있었습니다. headers-queue2만이 x-match가 any였기 때문에 특정 하나만 일치하면 응답을 할 수 있도록 되어있어 받을 수 있었습니다.
그 외 headers-queue1과 headers-queue3는 x-match - all로 모든 헤더가 일치해야 하기 때문에 응답하지 못했습니다.
- Total
- Today
- Yesterday
- Linux
- Quartz
- insert
- 이미지
- mybatis
- 컨테이너
- 격리수준
- ncp
- centos7
- Lock
- dfs
- hazelcast
- leatcode
- Java
- MySQL
- 캐시
- 권한
- docker
- spring
- 정의
- 알고리즘
- Cache
- LocalDate
- 스케줄러
- 캘린더
- 개념 이해하기
- 리눅스
- 네이버 클라우드
- 도커
- dockerfile
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |