队列长度限制
概述
您可以为队列设置最大长度。最大长度限制可以设置为消息数量,或者设置为字节数(所有消息体长度的总和,忽略消息属性和任何开销),或者两者都设置。
要设置最大长度(任何一种类型),您可以使用策略(强烈推荐此选项)或通过客户端使用队列的可选参数来定义。在同时使用这两种方式定义最大长度的情况下,将使用指定的两个值中的最小值。
队列长度设置也可以使用操作员策略进行配置。
在所有情况下,都使用处于就绪状态的消息数量。 未被消费者确认的消息不计入限制。
可以通过 rabbitmqCTL LIST_QUEUES 的输出中的 messages_ready 和 message_bytes_ready 来观察就绪消息的数量及其字节占用,管理界面和 HTTP API 响应中也有类似的字段。
默认最大队列长度限制行为
当设置了最大队列长度或大小并且达到最大值时,RabbitMQ 的默认行为是从队列的头部(即队列中最旧的消息)删除或死信消息。要修改此行为,请使用下面描述的 overflow 设置。
队列溢出行为
使用 overflow 设置来配置队列溢出行为。如果 overflow 设置为 reject-publish 或 reject-publish-dlx,则最新的发布消息将被丢弃。此外,如果启用了发布者确认,发布者将通过 basic.nack 消息收到拒绝通知。如果一条消息被路由到多个队列并且至少一个队列拒绝了它,RabbitMQ 会通过 basic.nack 通知发布者。该消息仍会发布到所有可以入队的队列。 reject-publish 和 reject-publish-dlx 之间的区别在于 reject-publish-dlx 还会将拒绝的消息死信。
使用策略定义最大队列长度
要使用策略指定最大长度,请将 max-length 键和/或 max-length-bytes 添加到策略定义中。例如:
- 使用 rabbitmqctl (bash)
- 使用 rabbitmqadmin (bash)
- 使用 rabbitmqctl (PowerShell)
- 使用 rabbitmqadmin (PowerShell)
rabbitmqctl set_policy my-pol "^one-meg$" \
'{"max-length-bytes":1048576}' \
--apply-to queues
rabbitmqadmin policies declare \
--name "my-pol" \
--pattern "^one-meg$" \
--definition '{"max-length-bytes":1048576}' \
--apply-to "queues"
rabbitmqctl.bat set_policy my-pol "^one-meg$" ^
"{""max-length-bytes"":1048576}" ^
--apply-to queues
rabbitmqadmin.exe policies declare ^
--name "my-pol" ^
--pattern "^one-meg$" ^
--definition "{""max-length-bytes"":1048576}" ^
--apply-to "queues"
my-pol 策略确保 one-meg 队列的消息数据不超过 1MiB。当达到 1MiB 的限制时,最旧的消息将从队列头部被丢弃。
要定义溢出行为 - 是从头部丢弃消息还是拒绝新发布,请将 overflow 键添加到策略定义中。例如:
- 使用 rabbitmqctl (bash)
- 使用 rabbitmqadmin (bash)
- 使用 rabbitmqctl (PowerShell)
- 使用 rabbitmqadmin (PowerShell)
rabbitmqctl set_policy my-pol "^two-messages$" \
'{"max-length":2,"overflow":"reject-publish"}' \
--apply-to queues
rabbitmqadmin policies declare \
--name "my-pol" \
--pattern "^two-messages$" \
--definition '{"max-length":2,"overflow":"reject-publish"}' \
--apply-to "queues"
rabbitmqctl.bat set_policy my-pol "^two-messages$" ^
"{""max-length"":2,""overflow"":""reject-publish""}" ^
--apply-to queues
rabbitmqadmin.exe policies declare ^
--name "my-pol" ^
--pattern "^two-messages$" ^
--definition "{""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 或 reject-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
- rabbitmqadmin
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 │
# => └───────┴─────────┴────────────┴──────────┴───────────────────┴──────────┘
RABBITMQADMIN QUEUES LIST 可用于显示队列信息。
rabbitmqadmin queues list
# => ┌──────────────┬───────┬────────────┬─────────┬─────────┬─────────────────────────┐
# => │ name │ vhost │ queue_type │ durable │ policy │ arguments │
# => ├──────────────┼───────┼────────────┼─────────┼─────────┼─────────────────────────┤
# => │ limited.cq.1 │ / │ classic │ true │ limited │ x-queue-type: "classic" │
# => ├──────────────┼───────┼────────────┼─────────┼─────────┼─────────────────────────┤
# => │ limited.qq.3 │ / │ quorum │ true │ limited │ x-queue-type: "quorum" │
# => ├──────────────┼───────┼────────────┼─────────┼─────────┼─────────────────────────┤
# => │ qq.1 │ / │ quorum │ true │ │ x-max-length: 7 │
# => │ │ │ │ │ │ x-queue-type: "quorum" │
# => ├──────────────┼───────┼────────────┼─────────┼─────────┼─────────────────────────┤
# => │ qq.2 │ / │ quorum │ true │ │ x-queue-type: "quorum" │
# => └──────────────┴───────┴────────────┴─────────┴─────────┴─────────────────────────┘
要查找由策略定义的参数,请使用 rabbitmqadmin policies list。
rabbitmqadmin policies list
# => ┌─────────┬───────┬────────────┬──────────┬──────────┬────────────────┐
# => │ name │ vhost │ pattern │ apply_to │ priority │ definition │
# => ├─────────┼───────┼────────────┼──────────┼──────────┼────────────────┤
# => │ limited │ / │ ^limited\. │ queues │ 0 │ max-length: 11 │
# => │ │ │ │ │ │ │
# => └─────────┴───────┴────────────┴──────────┴──────────┴────────────────┘
使用管理 UI
队列的可选参数和有效策略都可以在“队列”选项卡或单个队列页面上看到。

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