跳至主内容
版本:4.3

内存和磁盘告警

概述

在运行过程中,RabbitMQ 节点会根据工作负载消耗不同数量的内存和磁盘空间。当使用量激增时,内存和可用磁盘空间都可能达到危险水平。对于内存,节点可能会被操作系统的内存不足进程终止机制(例如 Linux 上的“OOM killer”)杀死。对于磁盘空间,节点可能会耗尽可用空间,这意味着它将无法执行许多内部操作。

为了降低出现这些情况的可能性,RabbitMQ 设置了两个可配置的资源水位线(watermark)。当达到这些水位线时,RabbitMQ 将阻塞发布消息的连接。

更具体地说,RabbitMQ 将阻塞发布消息的连接,以避免被操作系统杀掉(内存不足杀手)或耗尽所有可用磁盘空间。

节点将通过暂停从客户端连接读取数据来暂时阻塞发布连接。仅用于消费消息的连接不会被阻塞。

连接的心跳监控也将被停用。所有网络连接将在 rabbitmqctl 和管理界面中显示为 blocking(表示它们尚未尝试发布,因此可以继续)或 blocked(表示它们已经发布,现在处于暂停状态)。兼容的客户端在被阻塞时会收到通知

仅用于消费的连接不会受到资源警报的阻塞;向它们发送消息的操作将照常进行。

客户端通知

现代客户端库支持 connection.blocked 通知(一种协议扩展),因此应用程序可以监控自己何时被阻塞。

集群中的警报

在集群中运行 RabbitMQ 时,内存和磁盘警报是集群范围的;如果一个节点超过了限制,那么所有节点都将阻塞连接。

此处的目的是停止生产者,但让消费者不受影响地继续工作。然而,由于协议允许生产者和消费者在同一个通道上,以及在单个连接的不同通道上操作,这种逻辑并不完美。在实践中,这对大多数应用程序来说不会造成任何问题,因为节流现象仅表现为延迟。尽管如此,如果在其他设计考虑允许的情况下,建议将单独的连接仅用于生产或消费。

对数据安全的影响

当警报生效时,发布连接将受到 TCP 背压(back pressure)的阻塞。在实践中,这意味着发布操作最终会超时或直接失败。应用程序开发者必须准备好处理此类故障,并使用发布者确认(publisher confirms)来跟踪哪些消息已成功被 RabbitMQ 处理。

文件描述符耗尽

当服务器即将用尽操作系统分配给它的所有文件描述符时,它将拒绝客户端连接。请参阅网络指南以了解更多信息。

瞬时流控制

当客户端尝试发布消息的速度超过服务器接收消息的速度时,它们会进入瞬时流控制状态。

© . This site is unofficial and not affiliated with VMware.