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