Topic 自动创建开关配置项检查
巡检规则
本文中提及的 RocketMQ Copilot 术语是 AutoMQ Copilot for RocketMQ 的简称,均特指安托盟丘(杭州)科技有限公司面向 Apache RocketMQ 设计实现的消息队列智能辅助运维系统。
检测数据源
Topic 自动创建开关配置项的检测数据源是目标集群 BrokerConfig 信息,通过读取目标集群当前生效的配置,判断是否处于异常和风险的状态。
检测周期
- 每 10 分钟一次。
- 不可关闭。
异常检测逻辑
[BrokerConfig#autoCreateTopicEnable](https://github.com/apache/rocketmq/blob/release-4.9.4/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java#L47C21-L47C42)= true,则产生异常事件。
事件和风险
RocketMQ Copilot 系统巡检会对检测不通过的规则产生异常事件和风险,异常事件遵循 概述▸ 。
异常事件
- 异常事件类型:copilot:cluster:BrokerTopicAutoCreateEnableInspectionFailed
- 关于事件的详细 schema 定义,异常事件:主题自动创建被启用▸ 。
异常风险
- 关联的风险类型:主题自动创建被启用
风险分析
如果启用 Topic 自动创建开关,Broker 会自动创建一个名为 TBW102 的 Topic,此时若 Producer 发现试图发送的消息的 Topic 路由信息不存在,会通知 TBW102 所在的 Broker 为当前的 Topic 创建相同的路由信息;如果禁用 Topic 自动创建开关,当 Producer 发现 Topic 路由信息不存在时,会向客户端抛出异常。
自动创建 Topic 的开关,从最初代码设计初衷仅仅是在测试环境中启用该选项方便使用者快速上手,对于生产环境建议禁用。如果盲目启用该选项时一些可能的隐患包括:
- 导致 Topic 资源管理混乱。
- 可能会导致单一集群创建过多的 Topic ,会产生如下影响:
- 对应的 Consume Queue 会增多,带来更多的随机磁盘 IO,从而影响 Consume Queue 的分发效率,延长 Broker 启动以及异常宕机时的 Recovery 时间。
- Broker 上管理 Topic 资源的模块压力比较大。后续对 Topic 元数据的变更和向 Broker 注册路由信息都需要序列化 JSON 文件,太多的 Topic 会导致在老年代上直接分配大对象,加快 Broker FGC 的频率,出现明显的写入毛刺,影响服务质量。
- Producer 启动之后会自动获取 TBW102 的路由,而在发送心跳信息时也会一并往 TBW102 所在的 Broker Cluster 同步,可能会给 TBW102 所在的 Cluster 带来过多的网络连接和流量。
运维建议
建议 1:生产环境关闭自动创建 Topic
生产环境建议关闭该开关,仅在本地单机环境临时测试时开启。
建议 2:使用Admin API 集成实现自动化 Topic 管理
生产环境如需自动管理 Topic 资源,可以介入 Admin API 实现 Topic 自动化创建删除等管理。