可配置的限制和超时
简介
本指南提供了 RabbitMQ 可配置限制和超时的概述。
本指南有意省略了一些高级限制以及无法通过 rabbitmq.conf、虚拟主机 元数据、策略 或其他配置方式配置的限制,而是通过编程方式(例如,由 RabbitMQ 核心或插件)控制的限制。
为何使用可配置限制
现代消息和流式处理协议,例如 RabbitMQ 支持的协议,赋予应用程序开发人员定义其拓扑资源(如队列和流、交换器、绑定等)的自由。
其中一些资源可能会被应用程序无意中泄露。例如,应用程序可能会保持连接(或通道、会话)打开,不清理不再需要的队列或流,等等。
可配置限制是一种保护机制,允许集群操作员阻止此类应用程序消耗过多的资源,从而影响其他应用程序或集群的稳定性。
当 RabbitMQ 集群作为服务提供时,这种保护措施尤其重要。
可用限制
每个虚拟主机的限制
每个虚拟主机的限制,顾名思义,适用于特定的虚拟主机。
- 虚拟主机中的并发客户端连接的最大数量。
- 可以在虚拟主机中声明的队列和流的最大数量。
每个用户的限制
每个用户的限制适用于用户帐户(用户名)。
- 以该用户身份进行身份验证的最大并发客户端连接数。
- 用户所有连接上打开的最大并发通道数。
每个连接的限制
每个连接的限制适用于单个客户端连接。
rabbitmq.conf 设置 | 类型 | 描述 | 默认值 |
|---|---|---|---|
channel_max | 整数 | 客户端可以在单个连接上打开的最大 AMQP 0-9-1 通道数。防止应用程序泄露通道。通道号 0 保留用于内部使用。虽然默认值为 2047,但对于大多数用例,建议使用 16 到 128 之间的值。 | 2047 |
session_max_per_connection | 整数 | 每个连接的最大 AMQP 1.0 会话数。 | 1 |
link_max_per_session | 整数 | 每个会话的最大 AMQP 1.0 链接数。 | 10 |
handshake_timeout | 整数(毫秒) | AMQP 0-9-1 和 AMQP 1.0 握手完成允许的最大时间。 | 10000(10 秒) |
ssl_handshake_timeout | 整数(毫秒) | TLS 握手完成允许的最大时间。 | 5000(5 秒) |
heartbeat | 整数(秒) | 服务器在连接协商期间建议的心跳超时值。 | 60 |
frame_max | 整数(字节) | AMQP 1.0、AMQP 0-9-1 和RabbitMQ 流协议的最大帧大小。不应更改;应依赖服务器和客户端库的默认值。 | 131072(128 KiB) |
initial_frame_max | 整数(字节) | 连接调整之前的最大帧大小。不应更改;应依赖服务器和客户端库的默认值。 | 4096 |
RabbitMQ 支持的某些协议有其自身的特定限制。
MQTT
MQTT 连接有会话过期间隔限制。
rabbitmq.conf 设置 | 类型 | 描述 | 默认值 |
|---|---|---|---|
mqtt.max_session_expiry_interval_seconds | 整数(秒) | MQTT 客户端可以请求的最大会话过期间隔。 | 86400(1 天) |
每个通道的限制
consumer_max_per_channel 控制可以在单个通道上注册的最大使用者数量。此设置可防止应用程序泄露使用者。
默认值为无限制。要设置限制,请在 rabbitmq.conf 中进行配置。
consumer_max_per_channel = 10
每个集群的限制
以下设置在 rabbitmq.conf 中定义,但实际上适用于整个集群,因为它们限制的实体会在所有节点之间复制。
rabbitmq.conf 设置 | 类型 | 描述 | 默认值 |
|---|---|---|---|
vhost_max | 整数 | 集群中可以创建的最大虚拟主机数量。 | 无限制 |
cluster_exchange_limit | 整数 | 集群中可以声明的最大交换器数量。 | 无限制 |
cluster_queue_limit | 整数 | 集群中可以声明的最大队列数量。 | 无限制 |
由于这些设置是集群范围的,但通过每个节点的 rabbitmq.conf 配置文件单独配置,因此它们必须在所有集群节点上设置为相同的值。
每个节点的限制
每个节点的限制适用于各个集群节点。它们会影响所有虚拟主机和用户。
由于这些限制的粒度粗糙,因此通常在 RabbitMQ 集群作为服务提供的环境中用作保护措施,而集群操作员对部署的应用程序做什么既不了解也不受控制。
另请参阅:打开文件句柄限制。
rabbitmq.conf 设置 | 类型 | 描述 | 默认值 |
|---|---|---|---|
consumer_timeout | 正整数(毫秒) | 定义 RabbitMQ 等待使用者进行投递确认的时间。 | 1800000(30 分钟) |
connection_max | 整数 | 节点将接受的最大并发客户端连接数。 | 无限制 |
channel_max_per_node | 整数 | 节点上所有连接的总最大通道数。 | 无限制 |
ranch_connection_max | 整数 | 节点将接受的最大并发 TCP 连接数;包括HTTP API 连接。 | 无限制 |
max_message_size | 整数(字节) | 消息和流式客户端可以发布的は最大消息大小。大于此的消息将被拒绝。允许的最大值为 512 MiB。 | 134217728(128 MiB) |
management.http.max_body_size | 整数(字节) | 最大 HTTP API 请求正文大小。 | 20971520(20 MiB) |
每个队列的限制
可以通过策略为单个队列配置限制。
- 队列长度限制:限制队列中就绪消息的最大数量或消息总字节数。达到限制时,消息将从队列头部被丢弃,或拒绝新的发布。
- 消息 TTL:队列中的消息在指定时间段后过期。
- 队列 TTL:队列在一段时间不活动后会自动删除。
- 投递限制(仲裁队列):在消息被丢弃或发送到死信队列之前,最大投递尝试次数。在 RabbitMQ 4.0+ 中默认为 20,在 3.x 中为无限制。通过
delivery-limit策略键或队列参数配置。 - 优先级级别(优先级队列):
x-max-priority队列参数定义了最大优先级级别(1-255)。建议使用 1 到 5 之间的值以获得最佳性能。
每个流的限制
流具有保留设置,用于控制数据过期。
max-age:流中消息的最大年龄(例如,7 天为7D)。max-length-bytes:流的总最大字节大小。
达到保留限制时,最旧的段将被丢弃。这些可以通过策略或在流声明时作为可选的流参数进行配置。
请参阅流指南以了解更多信息。