SpringBoot整合RabbitMQ--队列长度--用法/实例

原文网址:SpringBoot整合RabbitMQ--队列长度--用法/实例_IT利刃出鞘的博客-CSDN博客

简介

说明

        本文用示例介绍SpringBoot整合RabbitMQ时如何处理队列的长度。

Rabbitmq官网

最大长度

队列长度限制

  • 队列的最大长度可以限制为一组消息数或一组字节数(忽略消息属性和其他开销的所有消息体长度总和),或者两者兼有。
  • 默认情况下,rabbitmq中的queue的最大长度和总字节数不受限制的(仅受全局内存,磁盘阈值的影响)。
  • 对于任何给定的队列,最大长度(任一类型)可以由客户端使用队列的参数来定义,也可以在服务器中使用配置策略(policies)来定义。在策略和参数都指定最大长度的情况下,将应用两个值中的较小值。
  • 队列长度可以使用 operator policies 强制设置。
  • 在所有情况下,都使用 就绪 消息的数量;未确认的消息不计入限制。
  • rabbitmqctl list_queues 中的字段 messages_ready, message_bytes_ready 以及管理 API 展示的即为被限制的值。

默认最大队列长度限制行为

        当设置了最大队列长度或大小并达到最大值时,RabbitMQ 的默认行为是从队列前面丢弃或 dead-letter 消息(即队列中最早的消息)。要修改这种行为,请使用下面描述的 overflow 设置。

队列溢出行为

        使用溢出设置来配置队列溢出行为。如果 overflow 设置为 reject-publish,则最近发布的消息将被丢弃。此外,如果 发布者确认 已启用,将通过 basic.nack 消息对发布者进行拒绝通知。如果一条消息被路由到多个队列并被其中至少一个队列拒绝,该信道将通过 basic.nack 通知发布者。该消息仍将被发布到可以将其排队的所有其他队列。

使用配置定义最大队列长度

        要使用配置指定最大长度,请将关键词 max-length 和 / 或 max-length-bytes 添加到配置定义中。例如:

type value
rabbitmqctl rabbitmqctl set_policy my-pol “^one-meg$” \ 
‘{“max-length-bytes”:1048576}’ \ 
--apply-to queues
rabbitmqctl on Windows rabbitmqctl.bat set_policy my-pol “^one-meg$” ^
"{"“max-length-bytes”":1048576}" ^
--apply-to queues

        my-pol 策略确保 one-meg 队列包含不超过 1MB 的消息数据。当达到1mB的限制时,最早的消息将从队列头中丢弃。

        要定义溢出行为-是从头上删除消息还是拒绝新发布,需要将关键词 overflow 添加到策略定义中。例如:

rabbitmqctl rabbitmqctl set_policy my-pol "^two-messages$" \
  '{"max-length":2,"overflow":"reject-publish"}' \
  --apply-to queues
rabbitmqctl on Windows rabbitmqctl.bat set_policy my-pol "^two-messages$" ^
  "{""max-length"":2,""overflow"":""reject-publish""}" ^
  --apply-to queues

        my-pol 策略确保 two-messages 队列包含的消息不超过 2 条,并且所有其他发布都是基本发送的。只要队列包含 2 条消息并且发布者确认启用的情况下,其他发送的消息都会得到 basic.nack 响应。

在声明队列期间使用 x-arguments 定义最大队列长度

1)为队列声明参数 x-max-length 提供一个非负整数值来设置最大消息条数。

2)声明参数 x-max-length-bytes 提供一个非负整数值,设置最大字节长度。如果设置了两个参数,那么两个参数都将适用;无论先达到哪个限制,都将强制执行。

3)溢出行为可以通过向队列声明参数 x-overflow 提供字符串值来设置。可能的值是:
    drop-head (默认值):从队列前面丢弃或 dead-letter 消息,保存后n条消息
    reject-publish:最近发布的消息将被丢弃,即保存前n条消息。

下面 Java 中的这个示例声明了一个最大长度为10条消息的队列:

//创建队列
HashMap<String, Object> map = new HashMap<>();
//设置队列最大的条数 10条
map.put("x-max-length",10 );
//设置队列溢出方式    保留前10条
map.put("x-overflow","reject-publish" );
channel.queueDeclare(queueName,false,false,false,map);

策略配置也可以通过管理插件定义。详细请看 相关文档 

其他网址

RabbitMQ 队列消息的条数限制、队列字节长度限制、队列溢出行为方式_From Zero To Hero-CSDN博客_rabbitmq 队列数量上限
rabbitmq 限制队列长度和总字节数 | 大专栏

猜你喜欢

转载自blog.csdn.net/feiying0canglang/article/details/124956696