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