Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- NCP
- Go
- CentOS
- AWS
- SQL
- nodejs
- Backbone.js
- Node
- Switch
- React
- Babel
- Redux
- Machine Learning
- 블레이드 템플릿
- linux
- mariadb
- php
- fastapi
- deep learning
- phpredis
- Redis
- docker
- For
- laravel
- python
- webpack
- 기초 수학
- nginx
- javascript
- rabbitmq
Archives
- Today
- Total
개발일기
RabbitMQ - Exchange 생성 및 Type 정리 본문
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
https://stackoverflow.com/questions/25801651/amqp-exchanges-are-not-auto-deleted
https://phsun102.tistory.com/144
728x90
반응형
'Messaging Broker > RabbitMQ' 카테고리의 다른 글
RabbitMQ - Queue에 메시지 전달 및 처리하기 (0) | 2023.04.02 |
---|---|
RabbitMQ - Node.js로 RabbitMQ 연결하기 (0) | 2023.03.22 |
RabbitMQ - 설치 및 계정 사용법 (0) | 2023.03.01 |
RabbitMQ - Stats in management UI are disabled on this node (0) | 2023.02.13 |
Comments