可配置的限制和超时
简介
本指南概述了 RabbitMQ 提供的可配置限制和超时设置。
本指南特意略去了一些高级限制,以及无法通过 rabbitmq.conf、虚拟主机 元数据、策略 或其他配置方式进行配置,而是通过程序控制(例如由 RabbitMQ 核心或插件控制)的限制。
为什么要使用可配置限制
现代消息传递和流协议(如 RabbitMQ 所支持的那些)让应用程序开发人员可以自由定义其拓扑资源(例如队列和流、交换器、绑定等)。
其中一些资源可能会被应用程序无意中泄漏。例如,应用程序可能会保持连接(或通道、会话)打开而不关闭,或者不清理不再需要的队列或流等。
可配置限制是一种保护机制,允许集群操作员防止此类应用程序占用过多资源,从而影响其他应用程序或集群的稳定性。
当 RabbitMQ 集群作为服务提供时,此类护栏尤为重要。
可用限制
虚拟主机 (Virtual Host) 限制
虚拟主机限制,顾名思义,适用于特定的虚拟主机。
- 虚拟主机中并发客户端连接的最大数量
- 可以在虚拟主机中声明的队列和流的最大数量
用户限制
用户限制适用于用户账户(用户名)。
- 以该用户身份进行身份验证的并发客户端连接的最大数量
- 该用户所有连接上打开的并发通道的最大总数
连接限制
连接限制适用于单个客户端连接。
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 | 整数(字节) | 连接调优前的最大帧大小。不应更改;请依赖服务器和客户端库的默认值。 | 8192 |
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:流中消息的最长存活时间(例如,7D表示 7 天)max-length-bytes:流的总最大大小(字节)
当达到保留限制时,最旧的段将被丢弃。这些可以通过策略配置,或在声明流时作为可选流参数进行配置。
请参阅流指南以了解更多信息。