RabbitMQ 之队列长度限制

本文介绍RabbitMQ中队列长度限制的设定方法,包括消息数量与字节数限制,以及如何通过配置策略定义最大长度。同时,探讨了队列溢出时的行为设置,如drop-head和reject-publish。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列长度限制

概述

队列的最大长度可以限制为一组消息数或一组字节数(忽略消息属性和其他开销的所有消息体长度总和),或者两者兼有。

对于任何给定的队列,最大长度(任一类型)可以由客户端使用队列的参数来定义,也可以在服务器中使用配置策略(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 添加到配置定义中。例如:

typevalue
rabbitmqctlrabbitmqctl set_policy my-pol "^one-meg$" '{"max-length-bytes":1048576}' --apply-to queues
rabbitmqctl on Windowsrabbitmqctl.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 定义最大队列长度

可以通过为队列声明参数 x-max-length 提供一个非负整数值来设置最大消息数。

可以通过为队列声明参数 x-max-length-bytes 提供一个非负整数值,设置最大字节长度。

如果设置了两个参数,那么两个参数都将适用;无论先达到哪个限制,都将强制执行。

溢出行为可以通过向队列声明参数 x-overflow 提供字符串值来设置。可能的值是 drop-head (默认)或 reject-publish

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

Map<String, Object> args = new HashMap<String, Object>();
args.put("x-max-length", 10);
channel.queueDeclare("myqueue", false, false, false, args);

原文地址 https://www.rabbitmq.com/maxlength.html

### RabbitMQ 队列最大长度限制配置 在 RabbitMQ 中,可以通过声明队列时传递参数来设置队列的最大长度。当队列中的消息数量超过设定的最大值时,旧的消息会被移除以腾出空间给新的消息。 以下是实现这一功能的具体方法: #### 使用 `arguments` 参数设置队列最大长度 通过调用 `channel.queue_declare()` 方法并传入 `arguments` 字典可以定义队列的行为属性。其中,键 `'x-max-length'` 可用于指定队列的最大消息数[^2]。 下面是一个 Python 示例代码片段展示如何设置队列的最大长度为 1000 条消息: ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 设置队列的最大长度为 1000 条消息 arguments = { 'x-max-length': 1000, # 最大消息数 } channel.queue_declare(queue='my_queue', durable=True, arguments=arguments) connection.close() ``` 上述代码中,`'x-max-length'` 被用来控制队列内的消息上限。一旦达到该限制,最早进入队列的消息将会被丢弃或转移到死信队列(如果设置了死信交换器)。 #### 死信队列支持 如果希望超出长度限制的消息不会简单地丢失而是发送到另一个队列,则可以在创建队列时进一步配置死信交换器和路由键。这同样可通过 `arguments` 完成,如下所示: ```python arguments = { 'x-max-length': 1000, 'x-dead-letter-exchange': 'dl_exchange', 'x-dead-letter-routing-key': 'dl_routing_key' } ``` 这样,任何因超限而被淘汰的消息都会按照指定的死信机制处理。 #### CLI 工具扩展策略 除了程序化方式外,还可以利用命令行工具 rabbitmqctl 对现有队列应用高可用性或其他管理政策。例如,在所有节点上启用镜像复制以便提高可靠性[^1]。 注意:CLI 的操作通常针对的是更广泛的集群管理和运维需求,而非单一队列特性调整。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值