跳到主要内容
版本: 4.1

队列长度限制

概述

您可以设置队列的最大长度。最大长度限制可以设置为消息数量,也可以设置为字节数(所有消息体长度的总和,忽略消息属性和任何开销),或者两者都设置。

要设置最大长度(两种类型中的任何一种),您可以使用策略(强烈推荐此选项)或客户端使用队列的可选参数来定义它。在同时使用两种方式定义最大长度的情况下,即使用策略和使用参数,则使用指定的两个值中的最小值。

使用操作员策略配置的队列长度设置。

在所有情况下,都使用就绪状态的消息数量。消费者未确认的消息不计入限制。

可以使用rabbitmqctl list_queues输出中的messages_readymessage_bytes_ready,以及管理 UI 和 HTTP API 响应中类似命名的字段来观察就绪消息的数量及其字节占用空间。

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

当设置了最大队列长度或大小时,RabbitMQ 的默认行为是在达到最大值时,从队列的前端(即队列中最旧的消息)删除或死信消息。要修改此行为,请使用下面描述的 overflow 设置。

队列溢出行为

使用 overflow 设置来配置队列溢出行为。如果 overflow 设置为 reject-publishreject-publish-dlx,则最近发布的消息将被丢弃。此外,如果启用了生产者确认,则将通过 basic.nack 消息通知生产者。如果消息路由到多个队列并且至少被其中一个队列拒绝,则通道将通过 basic.nack 通知生产者。消息仍将发布到所有其他可以将其入队的队列。reject-publishreject-publish-dlx 之间的区别在于 reject-publish-dlx 还会死信被拒绝的消息。

使用策略定义最大队列长度

要使用策略指定最大长度,请将键 max-length 和/或 max-length-bytes 添加到策略定义。例如

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 队列包含不超过 1MiB 的消息数据。当达到 1MiB 限制时,最旧的消息将从队列头部丢弃。

要定义溢出行为 - 是从头部删除消息还是拒绝新的发布,请将键 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-publishreject-publish-dlx

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

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

检查队列长度限制

要检查队列的有效限制,请检查其可选参数有效策略

这可以使用 CLI 工具或管理 UI 完成。

使用 CLI 工具

rabbitmqctl list_queues 可用于显示可选队列参数和应用于队列的策略(如果有)

rabbitmqctl list_queues name durable arguments policy --formatter=pretty_table --silent
# => ┌──────────────┬─────────┬──────────────────────────────────────────────────────────────────────┬─────────┐
# => │ name │ durable │ arguments │ policy │
# => ├──────────────┼─────────┼──────────────────────────────────────────────────────────────────────┼─────────┤
# => │ qq.1 │ true │ {<<"x-queue-type">>,longstr,<<"quorum">>}{<<"x-max-length">>,long,7} │ │
# => ├──────────────┼─────────┼──────────────────────────────────────────────────────────────────────┼─────────┤
# => │ limited.qq.3 │ true │ {<<"x-queue-type">>,longstr,<<"quorum">>} │ limited │
# => ├──────────────┼─────────┼──────────────────────────────────────────────────────────────────────┼─────────┤
# => │ limited.cq.1 │ true │ {<<"x-queue-type">>,longstr,<<"classic">>} │ limited │
# => ├──────────────┼─────────┼──────────────────────────────────────────────────────────────────────┼─────────┤
# => │ qq.2 │ true │ {<<"x-queue-type">>,longstr,<<"quorum">>} │ │
# => └──────────────┴─────────┴──────────────────────────────────────────────────────────────────────┴─────────┘

要找出策略定义的参数,请使用 rabbitmqctl list_policies

rabbitmqctl list_policies --formatter=pretty_table --silent
# => ┌───────┬─────────┬────────────┬──────────┬───────────────────┬──────────┐
# => │ vhost │ name │ pattern │ apply-to │ definition │ priority │
# => ├───────┼─────────┼────────────┼──────────┼───────────────────┼──────────┤
# => │ / │ limited │ ^limited\. │ queues │ {"max-length":11} │ 0 │
# => └───────┴─────────┴────────────┴──────────┴───────────────────┴──────────┘

使用管理 UI

可以在“队列”选项卡或单个队列页面上看到可选队列参数和队列的有效策略

Effective queue policy and optional arguments in management UI

策略名称是一个可点击的链接,可链接到策略定义页面,您可以在其中查看限制

Effective queue policy and optional arguments in management UI

© . All rights reserved.