目录
队列长度限制
默认最大队列长度限制行为
队列溢出行为
使用配置定义最大队列长度
在声明队列期间使用 x-arguments 定义最大队列长度(重点阅读即可)
概述
队列的最大长度可以限制为一组消息数或一组字节数(忽略消息属性和其他开销的所有消息体长度总和),或者两者兼有。
对于任何给定的队列,最大长度(任一类型)可以由客户端使用队列的参数来定义,也可以在服务器中使用配置策略(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
响应。
策略配置也可以通过管理插件定义。详细请看 相关文档
1)为队列声明参数 x-max-length 提供一个非负整数值来设置最大消息条数。
2)声明参数 x-max-length-bytes 提供一个非负整数值,设置最大字节长度。如果设置了两个参数,那么两个参数都将适用;无论先达到哪个限制,都将强制执行。
3)溢出行为可以通过向队列声明参数 x-overflow 提供字符串值来设置。可能的值是:
drop-head (默认值):从队列前面丢弃或 dead-letter 消息,保存后n条消息
reject-publish:最近发布的消息将被丢弃,即保存前n条消息。
下面 Java 中的这个示例声明了一个最大长度为10条消息的队列:
//创建队列
HashMap map = new HashMap<>();
//设置队列最大的条数 10条
map.put("x-max-length",10 );
//设置队列溢出方式 保留前10条
map.put("x-overflow","reject-publish" );
channel.queueDeclare(queueName,false,false,false,map);
原文地址 https://www.rabbitmq.com/maxlength.html