队列长度限制
概述
您可以为队列设置最大长度。最大长度限制可以设置为消息数量,也可以设置为字节数(所有消息体长度的总和,忽略消息属性和任何开销),或者两者都设置。
要设置最大长度(任意一种类型),您可以使用策略进行定义(强烈推荐此选项),或者客户端可以使用队列的可选参数。在使用两种方式定义最大长度的情况下,即使用策略和使用参数,则使用指定的两个值中的最小值。
使用操作员策略配置的队列长度设置。
在所有情况下,都会使用**就绪**状态下的消息数量。消费者未确认的消息不计入限制。
可以使用rabbitmqctl list_queues
输出中的messages_ready
和message_bytes_ready
观察**就绪**消息的数量及其占用字节数,以及管理 UI 和 HTTP API 响应中类似命名的字段。
默认最大队列长度限制行为
当设置了最大队列长度或大小并且达到最大值时,RabbitMQ 的默认行为是从队列头部丢弃或死信消息(即队列中最旧的消息)。要修改此行为,请使用下面描述的overflow
设置。
队列溢出行为
使用overflow
设置配置队列溢出行为。如果将overflow
设置为reject-publish
或reject-publish-dlx
,则将丢弃最近发布的消息。此外,如果启用了发布者确认,则发布者将通过basic.nack
消息获知拒绝。如果一条消息被路由到多个队列,并且至少一个队列拒绝了它,则通道将通过basic.nack
通知发布者。消息仍将发布到所有其他可以将其入队的队列。reject-publish
和reject-publish-dlx
之间的区别在于,reject-publish-dlx
还会死信被拒绝的消息。
使用策略定义最大队列长度
要使用策略指定最大长度,请将键max-length
和/或max-length-bytes
添加到策略定义中。例如
rabbitmqctl |
|
---|---|
Windows 上的 rabbitmqctl |
|
my-pol
策略确保one-meg
队列包含的消息数据不超过 1MiB。当达到 1MiB 限制时,最旧的消息将从队列头部丢弃。
要定义溢出行为 - 是否从头部丢弃消息或拒绝新的发布,请将键overflow
添加到策略定义中。例如
rabbitmqctl |
|
---|---|
Windows 上的 rabbitmqctl |
|
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 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
队列的可选队列参数和有效策略都可以在“队列”选项卡或单个队列页面上查看。
策略名称是可点击的链接,可链接到策略定义页面,您可以在其中查看限制。