yoncho`s blog

[RabbitMQ] 6. Queue 옵션으로 Message Control 본문

기술, 나의 공부를 공유합니다./MQTT

[RabbitMQ] 6. Queue 옵션으로 Message Control

욘초 2023. 6. 24. 13:41

1. 옵션(max-length, max-lenght-byte, reject-publish(overflow), max-message-ttl)

2. 예제

3. 참조

1. 옵션

AssertQueue

- MAX-LENGTH

channel.assertQueue(queueName, { arguments : {'x-max-length': 100} });

 

Queue에 쌓을 수 있는 Messag 최대 수를 지정하는 옵션.
Queue를 지정할 때 arguments로 ‘x-max-length’ 값에 원하는 길이를 지정하면
Queue에 최대 해당 길이만큼 데이터를 가지고 있을 수 있고 해당 길이를 초과한 경우 기본적으로 가장 오래된 Message부터 지우게된다.

 

- MAX-LENGTH-BYTES

channel.assertQueue(queueName, { arguments : {'x-max-length-bytes': 100} });

 

Queue에 쌓을 수 있는 Message의 총 Byte를 지정할 수 있다.

 

 

- REJECT-PUBLISH

channel.assertQueue(queueName, { arguments : {'x-overflow': 'reject-publish'} });

 

Queue에 쌓을 수 있는 Messag 최대 수를 초과했을 때 Queue에 더 이상 Publish되지 않게 막는 옵션
Queue를 지정할 때 ‘x-max-length’ 사용하고 위 옵션을 주게 되면 Queue에 먼저 쌓인 Message부터 총 x-max-length개 만큼만 가지고 있다.

 

 

- MAX-MESSAGE-TTL

*TTL : Time-To-Live, 메시지 유효 시간

channel.assertQueue(queueName, { arguments : {'x-messsag-ttl': 5000} });

 

Queue에 쌓을 수 있는 Message의 유효 시간 옵션, 해당 시간이 지나도 Consume이 되지 않으면 Queue에서 자동 삭제된다.

 


Publish

 

- MANDATORY

channel.publish(exchange, routingKey, Buffer.from(message), {mandatory:true});

RabbitMQ에게 메시지를 반드시 라우팅할 수 있는 라우팅 키(routing key)와 매칭되는 큐가 없는 경우에 대한 처리 방법을 지정 옵션

  • true : 메시지가 라우팅할 수 있는 큐가 없는 경우에도 RabbitMQ는 해당 메시지를 반환합니다. 반환된 메시지는 basic.return 이벤트를 통해 Publisher에게 전달
  • false : 메시지가 라우팅할 수 있는 큐가 없는 경우 RabbitMQ는 해당 메시지를 무시하고 삭

 

- PERSISTENT

channel.publish(exchange, routingKey, Buffer.from(message), {persistent: true});

메시지를 영구적으로 저장할지 여부를 지정합니다. 영구적인 메시지는 RabbitMQ가 재시작되더라도 유지되며, 메시지 유실을 방지 옵션

  • true : 메시지가 디스크에 저장되고 영구적으로 유지됩니다. 메시지는 디스크에 저장되기 때문에 재시작 이후에도 유실되지 않음.
  • false : 메시지는 메모리에만 저장되며 재시작 시에는 유실될 수 있음.

 

 

2. 예제

Publisher.js - AssertQueue (with Option)

 await channel.assertQueue(queueName, 
     {arguments: {
         'x-max-length':10,                //Queue에 최대 10개 Message 적재
         'x-overflow':'reject-publish',    //Queue 최대 적재를 over했을 시, Publish되는 Message 무시
         'x-message-ttl':5000,             //Queue에 적재될 Message가 Consume이 안된다면 최대 유효시간
         durable: false} });
await channel.bindQueue(queueName, exchange, routingKey);
channel.publish(exchange, routingKey, Buffer.from(message), {mandatory:true, persistent: true});

 

Result 

- Normal Flow

 

- Max Queue Over (reject-publish) Flow

 

 

- Message TTL Over Flow

 

 

참조 :
https://www.rabbitmq.com/maxlength.html

Comments