RabbitMQ 之队列长度限制

队列长度限制

概述

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

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

策略配置也可以通过管理插件定义。详细请看 相关文档

在声明期间使用 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

猜你喜欢

转载自blog.csdn.net/qq_35958788/article/details/91483790