ConsumerGroup 订阅关系一致性检查
巡检规则
本文中提及的 RocketMQ Copilot 术语是 AutoMQ Copilot for RocketMQ 的简称,均特指安托盟丘(杭州)科技有限公司面向 Apache RocketMQ 设计实现的消息队列智能辅助运维系统。
检测数据源
ConsumerGroup 订阅关系一致性检查的检测数据源是查看 ConsumerGroup 下各 Consumer 的实时订阅关系,通过比对各个 Consumer 的订阅关系是否一致,判断是否存在风险。
检测周期
- 每 10 分钟一次。
- 不可关闭。
异常检测逻辑
检查相同 ConsumerGroup 下的多个 Consumer 的订阅关系是否一致,如果不一致则产生异常事件。
事件和风险
RocketMQ Copilot 系统巡检会对检测不通过的规则产生异常事件和风险,异常事件遵循 概述▸ 。
异常事件
- 异常事件类型:copilot:consumergroup:ConsumerGroupSubscriptionConsistencyInspectionFailed
- 关于事件的详细 schema 定义,异常事件:消费者组订阅关系不一致▸ 。
异常风险
- 关联的风险类型:消费者组订阅关系不一致
风险分析
RocketMQ 中,一个 Consumer Group 的订阅关系只有一种。属于这个 Consumer Group 下的所有 Consumer 需要拥有相同的订阅关系。
需要保证同一个 Consumer Group 下的所有 Consumer 拥有相同的订阅关系。以下情况均属于订阅关系不一致:
- Consumer 之间订阅了不同的 Topic。
- Consumer 之间订阅相同的 Topic,但是 Tag 或者 SQL 过滤的条件不同。
订阅关系不一致会造成 Consumer 负载均衡结果的混乱。在不同的订阅关系下,每个 Consumer 按照自己的订阅关系进行负载均衡,那么:
- 如果订阅的 Topic 不一致,会出现部分队列没有消费者负责的情况。
- 如果 Topic 的过滤条件不一样(包含 Tag 过滤和 SQL 过滤),可能会出现符合过滤条件的消息没有消费者进行消费的情况。
以上都会导致 Consumer 消费时出现消息丢失。
除此之外,如果消费者订阅关系不一致,服务端对同一个 Consumer Group 的订阅关系会出现相互覆盖,当 A Consumer 尝试拉取的队列的 Topic 在服务端订阅关系中不存在时会出现 the consumer's subscription not exist 的报错导致拉取失败。
运维建议
建议 1:生产环境基于统一配置管理订阅相关的配置信息,避免不同节点和版本不一致
生产环境建议安装统一的配置系统下发关于订阅关系的配置信息,避免因不同节点使用了不同版本、不同的本地配置导致订阅关系不一致。