内存和磁盘告警
概述
在运行过程中,RabbitMQ 节点会根据工作负载消耗不同数量的内存和磁盘空间。当使用量激增时,内存和可用磁盘空间都可能达到危险水平。对于内存,节点可能会被操作系统的内存不足进程终止机制(例如 Linux 上的“OOM killer”)杀死。对于磁盘空间,节点可能会耗尽可用空间,这意味着它将无法执行许多内部操作。
为了降低出现这些情况的可能性,RabbitMQ 设置了两个可配置的资源水位线(watermark)。当达到这些水位线时,RabbitMQ 将阻塞发布消息的连接。
更具体地说,RabbitMQ 将阻塞发布消息的连接,以避免被操作系统杀掉(内存不足杀手)或耗尽所有可用磁盘空间。
节点将通过暂停从客户端连接读取数据来暂时阻塞发布连接。仅用于消费消息的连接不会被阻塞。
连接的心跳监控也将被停用。所有网络连接将在 rabbitmqctl 和管理界面中显示为 blocking(表示它们尚未尝试发布,因此可以继续)或 blocked(表示它们已经发布,现在处于暂停状态)。兼容的客户端在被阻塞时会收到通知。
仅用于消费的连接不会受到资源警报的阻塞;向它们发送消息的操作将照常进行。
客户端通知
现代客户端库支持 connection.blocked 通知(一种协议扩展),因此应用程序可以监控自己何时被阻塞。
集群中的警报
在集群中运行 RabbitMQ 时,内存和磁盘警报是集群范围的;如果一个节点超过了限制,那么所有节点都将阻塞连接。
此处的目的是停止生产者,但让消费者不受影响地继续工作。然而,由于协议允许生产者和消费者在同一个通道上,以及在单个连接的不同通道上操作,这种逻辑并不完美。在实践中,这对大多数应用程序来说不会造成任何问题,因为节流现象仅表现为延迟。尽管如此,如果在其他设计考虑允许的情况下,建议将单独的连接仅用于生产或消费。
对数据安全的影响
当警报生效时,发布连接将受到 TCP 背压(back pressure)的阻塞。在实践中,这意味着发布操作最终会超时或直接失败。应用程序开发者必须准备好处理此类故障,并使用发布者确认(publisher confirms)来跟踪哪些消息已成功被 RabbitMQ 处理。
文件描述符耗尽
当服务器即将用尽操作系统分配给它的所有文件描述符时,它将拒绝客户端连接。请参阅网络指南以了解更多信息。
瞬时流控制
当客户端尝试发布消息的速度超过服务器接收消息的速度时,它们会进入瞬时流控制状态。
相关主题
- 确定运行节点上的内存使用情况
- 内存警报
- 可用磁盘空间警报
- 客户端如何确定它们是否被阻塞