개발일기

RabbitMQ - Exchange 생성 및 Type 정리 본문

Messaging Broker/RabbitMQ

RabbitMQ - Exchange 생성 및 Type 정리

Flashback 2023. 3. 26. 11:00
728x90
반응형

RabbitMQ의 큐에 메시지를 전달할 때, exchange 타입에 따라 저장할 큐를 선택하여 해당되는 큐들에 메시지를 보낼 수 있다. Laravel의 라우트와 비슷한 개념으로 큐 이름을 지정하거나 와일드카드로 패턴을 지정하여 설정할 수 있다.

 

1. Binding

Exchange에 라우팅 키를 지정하는 것을 binding이라 한다. 즉, 정해진 타입에 규칙을 추가하는 것을 의미한다. 라우팅 키는 Exchange 타입에 상관없이 지정할 수 있지만, 타입에 따라 라우팅 패턴이 다르기에 매칭되는 큐가 달라질 수 있다.

 

2. Exchange Type

exchange 종류에는 fanout, direct, headers, topic이 있다.

  • fanout : 바인딩된 모든 큐에 동일한 메시지를 전달한다. 즉, 문자열 구분과 라우팅 키에 대한 구별없이 자신과 연결된 큐에 모두 메시지를  보낸다.
  • direct : 라우팅 키가 정확하게 일치하는 큐에 메시지를 전달한다. 와일드카드를 사용하여 라우팅 키의 패턴을 정의할 수 있는데, 두루뭉실한 패턴의 일치가 아니라 정확하게 키값이 일치해야 전달된다. 즉, 키 값이 router.test.1이면 routing.test.1로 바인딩받은 큐에 메시지를 전달한다. 2, 3 과 같이 패턴으로 일치하는 큐에는 전달하지 않는다.
# routing key : fruit.direct.orange
#### queue name #####
# fruit.direct.ornage -> 메시지 전달O
# fruit.direct.melon -> 메시지 전달X
  • headers : 큐 속성값의 headers 테이블을 사용해 라우팅 처리한다. 헤더에 속해있는 key: value에 값에 따라 일치하는 큐에 메시지를 전달한다.
# routing key : fruit.headers.orange / header값 { price: 1000 }
#### queue name #####
# fruit.headers.orange / header값 { price: 1000 } -> 메시지 전달O
# fruit.headers.orange / header값 { price: 2000 } -> 메시지 전달X
  • topic : 라우팅 키 패턴의 일치여부에 따라 메시지를 라우팅한다. exchange에 바인딩할 바인딩 키 패턴을 지정할 때, .(점) 단위로 단어를 구분시켜 패턴을 지정한다. 여러개의 단어를 점 단위로 구분하여 나열한 후, *와 #과 같은 와일드 카드를 사용하여 패턴을 지정할 수 있다.
    • * : *를 사용하여 test.router.*라는 패턴을 생성하면 test.router.1, test.router.2와 같이 한 단어의 패턴이 일치하는 라우팅 키를 가진 큐에 메시지를 전달한다.
    • # : #를 사용하여 test.router.#라는 패턴을 생성하면 test.router.orange.yummy, test.router.banana.good과 같이 와일드 카드 이후에 나오는 여러 단어의 패턴과 일치하는 라우팅 키를 가진 큐에 메시지를 전달한다.
# routing key : fruit.topic.#
#### queue name #####
# fruit.topic.orange -> 메시지 전달O
# fruit.topic.orange.yummy -> 메시지 전달O

# routing key : fruit.topic.*
#### queue name #####
# fruit.topic.orange -> 메시지 전달O
# fruit.topic.orange.yummy -> 메시지 전달X

 

3. Exchange 생성

import dotenv from 'dotenv';
import amqplib from 'amqplib/callback_api.js'

dotenv.config();

amqplib.connect({
    'hostname': process.env.RABBITMQ_HOST,
    'username': process.env.RABBITMQ_ID,
    'password': process.env.RABBITMQ_PASSWORD,
    'port': process.env.RABBITMQ_PORT,
    'vhost': process.env.RABBITMQ_VHOST,
}, (err, conn) => {
    if(err) {
        console.log("Err: ", err);
        return false;
    }

    conn.createChannel((err, ch) => {
        if(err) {
            console.log("Err: ", err);
            return false;
        }

        // 생성된 채널에 exchange를 생성한다.
        ch.assertExchange(
            'name', 'direct', {durable: true}
        ); // exchange 이름, exchange 종류, exchange 옵션
    });
})

 

3-1. assertExchange

ch.assertExchange('fruit.direct', 'direct', {durable: true})
  • assertExchange("이름", "타입", {옵션}) : 이름은 exchange에 들어갈 이름을 지정한다. 사람에 따라 다른긴하지만 필자는 보통 vhost.type으로 이름을 지정한다. 즉, vhost가 fruit이며 exchange type이 direct면 이름을 fruit.direct로 지정하여 exchange를 생성한다.
    • durable : true로 설정하면 RabbitMQ가 재시작되어도 생성된 exchange가 그대로 유지된다. 기본값은 true이다.
    • autoDelete : exchange에 바인딩된 키가 제거된 경우, exchange를 제거한다. 기본값은 false이다.
    • internal : 생성된 exchange에 메시지를 직접적으로 보낼 수 없고 해당 exchange가 binding된 다른 exchange를 통해 전달하도록 설정하는 옵션이다. 기본값은 false이다.

3-2. deleteExchange

ch.deleteExchange("fruit.direct", {ifUnused: true})
  • deleteExchange("이름", {옵션}) : 삭제할 exchange를 지정하여 삭제한다.
    • inUnused : 옵션값이 true이고 exchange에 바인딩된 키가 존재하면 삭제하지 않는다.

 


참고 사이트 : 

https://amqp-node.github.io/amqplib/channel_api.html

 

amqplib | Channel API reference

Channel-oriented API reference There are two parallel client APIs available. One uses promises, and the other uses callbacks, mutatis mutandis. Since they present much the same set of objects and methods, you are free to choose which you prefer, without mi

amqp-node.github.io

 

https://stackoverflow.com/questions/25801651/amqp-exchanges-are-not-auto-deleted

 

amqp exchanges are not auto-deleted

I have rabbitmq 3.3.5 running and nodejs project based on amqplib 0.2.1 The problem is that once exchange has been asserted it does not deleted after connection to rabbitmq is closed. If we start...

stackoverflow.com

 

https://stackoverflow.com/questions/32220312/rabbitmq-amqp-best-practice-queue-topic-design-in-a-microservice-architecture

 

RabbitMQ/AMQP - Best Practice Queue/Topic Design in a MicroService Architecture

We are thinking of introducing a AMQP based approach for our microservice infrastructure (choreography). We do have several services, let's say the customer-service, user-service, article-service e...

stackoverflow.com

 

https://phsun102.tistory.com/144

 

RabbitMQ - Node.js로 RabbitMQ 연결하기

1. 설치 1-1. amqplib 설치 npm install amqplib -D yarn add amqplib -D # rabbitmq에 연결하기 위해 amqplib를 설치한다. 1-2. dotenv 설치 npm install dotenv -D yarn add dotenv -D # RabbitMQ연결 정보가 저장된 .env파일을 사용하기

phsun102.tistory.com

 

728x90
반응형
Comments