做数据接入和实时处理的团队,几乎都会遇到同一个痛点:数据链路一多,整个系统就变成一团乱麻。业务线A要的订单数据、业务线B要的日志数据、算法组要的特征数据,全部堆在消息队列里,没有统一的管理,谁该订阅哪个主题,全靠口口相传;某个下游服务消费完数据,出了问题定位半天,最后发现是取错了主题;新来的同事接手数据需求,光梳理数据流向就花了一个星期。数据总线这个概念,本质上就是为了解决这种“数据越传越乱”的难题。它不只是一个传输管道,更是一套带命名的、可分发的、可治理的数据流管理体系。本期我用一个模拟项目的完整落地过程,聊聊如何把数据总线真正用起来,让流数据从“裸奔”变成“有序流动”。
1. 数据总线的定位与场景价值
1.1 数据总线到底是什么
数据总线(Data Bus)在实时计算领域,可以理解成一条高速公路上的车道系统。车是数据,车道是主题(Topic),路口是生产者,出口是消费者。没有车道的路,车一多必然拥堵、互相干扰;有了车道划分,每辆车都清楚自己该走哪条道,每条道上的车也知道自己的目的地。
从技术层面拆解,数据总线通常建立在消息中间件之上(实践中常用的是Kafka或RocketMQ这类系统),但它又比单纯的消息队列多了一个“命名”的维度。消息队列只保证数据能从一个节点传到另一个节点,而数据总线在传输语义之上,引入了一套可读性强的主题命名规范、清晰的生产消费权责边界,以及数据流状态的可见性。
比如某个订单服务要推送订单数据给下游做实时分析,如果在消息队列里直接写死一个叫“orders”的主题,刚开始没问题,但三个月后新的需求来了,要区分线上订单和线下订单,要区分原始订单和清洗后的订单,主题就会膨胀成orders_raw、orders_cleaned、orders_online、orders_offline……命名一旦失去规范,数据总线就退化成普通MQ,治理成本直线上升。
1.2 哪些场景必须依靠数据总线
数据总线不是所有系统都需要,但遇到以下三类情况,基本可以确定它是刚需:
第一,多源异构数据接入。企业的数据来源五花八门:业务库的binlog、App端埋点日志、第三方接口回调、IOT设备的传感器数据。这些数据格式不同、时效性不同,如果每条链路都直连下游,每增加一个消费方就要重复对接一次,维护成本非常高。通过数据总线统一接入,每种源数据对应一个固定主题,所有下游统一从总线订阅,达到“一次接入,多方复用”的效果。
第二,实时数仓的分层建设。实时数仓通常有ODS(操作数据存储)、DWD(明细数据)、DWS(汇总数据)三层,每一层之间数据流转最常用的方式就是通过消息队列做缓冲和分发。这种情况下,数据总线的主题命名天然要带上分层标识,比如ODS层的原始日志、DWD层的清洗明细、DWS层的指标宽表,这样每个团队看到主题名就能明白数据所处的阶段。
第三,跨团队的数据协作。数据团队和业务团队隔离程度高的公司,通常有一个专门的数据平台团队来维护总线。上游团队只负责往指定主题写入,下游团队从指定主题消费,双方不需要知道彼此的系统内部细节,只需要遵循总线上的命名契约和数据格式契约。
我在模拟项目中遇到的典型场景是这样的:某公司有用户服务、订单服务、营销服务三个业务模块,日志数据和业务事件都需要实时汇聚到一个统一的数据平台,供实时大屏、实时报表和推荐系统三个下游消费。这个场景如果不做数据总线,会出现严重的数据重复、语义混乱和权限失控。做了数据总线后,每个模块只跟总线打交道,数据流的归属和流转一目了然。
2. 核心机制拆解:命名通道的设计原理
2.1 主题(Topic)与命名通道的关系
数据总线最核心的抽象就是“命名通道”,落到工程实现上,就是主题(Topic)。主题本质上是一个逻辑上的命名空间,数据生产者往这个命名空间里写数据,数据消费者从这个命名空间里读数据,生产者和消费者之间不需要直接建立连接。
这个设计的巧妙之处在于解耦。生产者的数据一进总线,谁在消费、消费得快还是慢、有没有新增的消费方,这些生产者都不需要关心。消费者只按需订阅自己关心的主题,总线保证数据被持久化、被保留一定时间、被可靠地投递给每个订阅了它的人。
举个例子,用户模块产生了一条用户注册事件,往“user_register”这个主题里写了一条JSON消息。实时大屏系统订阅了这个主题,实时数仓也订阅了这个主题。用户模块不关心有谁在消费,它只需要保证这条消息被成功写入总线。总线则负责把这条消息同时推给所有订阅者,如果某个订阅者暂时宕机,消息会保留在总线上,等它恢复后继续投递。
这就是命名通道的价值所在:一个好名字,就是一份微型文档。看到“user_register”就能知道这是用户注册事件;看到“order_paid_success”就能明白这是支付成功事件,基本不需要再追着人问。
2.2 生产与消费模型解析
数据总线上的生产者和消费者,是一套相对独立又互相约束的关系。我用一个实际的例子来讲清楚。
生产者端通常要关注三个要素:主题、分区键、消息体。分区键决定一条消息应该被写进主题的哪个分区,如果分区键相同,消息就有序地落在同一个分区里,这保证了同一业务实体的数据可以被顺序消费。比如订单事件,用订单ID作为分区键,那么同一个订单的创建、支付、完成事件,一定被顺序消费,不会出现“已完成”比“已支付”先被处理这种乱序问题。
消费者端关注的核心要素是消费组和消费位点。一个消费组表示一组同一逻辑角色的消费者,比如实时报表服务有3个实例,这3个实例属于一个消费组,总线上的数据会被分发到这个组内的不同实例上,但每条消息只会被组内的一个实例消费。如果实时大屏和实时报表是不同的消费组,那么它们都能独立消费所有消息,互不干扰。
把这两个模型理解清楚,才能正确规划总线上的主题规模和消费组数量。实践中有个容易被忽视的点:同一主题上挂了太多不同角色的消费组,总线压力会成倍增加,因为消息要被复制多份分别投递给不同的组。所以我一般会建议按消费逻辑归并消费组,不要一个微服务建一个组,而是按业务场景建组。
2.3 消息路由与分发策略
数据总线的消息路由,依赖的是“订阅关系”的匹配逻辑。消费者可以指定精确订阅某一个主题,也可以用通配符匹配一批主题。比如某个消费者订阅了“user_*”,那么所有以“user_”开头的主题(user_register、user_login、user_logout)都会被投递到这个消费者。
这在实际应用中有一个非常重要的用法:业务放量时的灰度订阅。比如系统升级前,新消费者订阅所有带“v2”后缀的新主题,老消费者继续订阅旧主题,两边并行运行一段时间,数据校验无误后再切换流量,整个过程对生产业务完全透明。
消息分发的颗粒度,一般是按主题-分区的粒度进行的。一个消费者组中有多个实例时,总线会给每个实例分配若干个分区,实例只消费自己负责的那些分区。这里最关键的设计是:分区与消费实例的绑定关系是动态的——某个实例宕机、重启或扩容缩容时,总线会触发重平衡,重新分配分区归属。这个机制保证了消费伸缩性,但也会带来重平衡期间的消费暂停,所以生产环境要做消费实例变更时,通常会选在业务低峰期。
2.4 数据持久化与保留策略
流数据虽然是在流动的,但并不代表它不落地。恰恰相反,数据总线的核心保障就是数据持久化。消息写入主题后,会被追加到磁盘日志中,按照配置的保留策略保留一段时间(实践中常见的是1天到7天),消费者滑到哪里就从头或从指定位置读。
这意味着两点。第一,数据不会因为某个消费端故障而丢失;第二,同一个主题的数据可以被反复消费、回溯消费。第二个特性在实际开发中非常有用:实时任务上线时,如果需要补算历史数据,可以让消费者从之前的位点重新拉取消息,不需要上游重发数据。我把这个能力叫作“数据总线的时间机器”,它对运维排查和故障恢复的价值极大。
但保留策略也有限制。磁盘空间有限,总线不可能无限期保存数据,所以要根据数据的重要性和下游消费时效性,合理设置保留周期。我见过有些团队把一周前的敏感业务数据还留在总线上,既不消费也不清理,最后磁盘告警,业务被迫中断。这是没有规划好数据生命周期的典型教训。
3. 命名规范设计:让每个通道名具备业务语义
3.1 主题命名五要素
数据总线好不好用,一半的功夫在主题命名上。命名规范这一块,我在模拟项目的实施过程中总结出五要素:业务域、数据类型、数据对象、动作/状态、环境标识。
一个完整的主题名,实践格式可以像这样:
{业务域}.{数据类型}.{数据对象}.{动作或状态}.{环境}比如:
order.binlog.order_info.upd.fix:订单域,binlog数据,订单信息表,更新事件,测试环境user.event.user_register.created.prod:用户域,事件数据,用户注册,创建事件,生产环境
采用这套格式有直接的工程意义:目录式的组织方式,让Kafka or RocketMQ的路由工具和监控面板上可以按前缀统一检索,运维时用通配符也能快速圈定相关主题。
要注意的是,环境标识不是每个主题都必需。如果测试环境和生产环境的集群是物理隔离的,环境标识可以省掉;如果共用集群,环境标识必须加上,否则测试环境的数据很容易被生产配置的消费者误读。
3.2 主题粒度划分的思路
主题的粒度大与小,直接影响总线的运营成本。主题切得太粗,比如把所有业务数据塞进一个主题,下游消费时要自己过滤、分流,总线本身的命名通道优势就丧失了;主题切得太细,比如每个业务流程的每个动作都单建主题,主题数量会爆炸式增长,管理成本和元数据维护成本都压不住。
我实践下来总结出了一个原则:按“数据语义是否独立被消费”来划分主题。一条数据如果会被多个业务场景独立消费,而且消费逻辑有明显差异,就应该单独建主题;如果一组数据永远一起被消费、一起被处理,就可以合并成一个主题。
举个例子:订单创建、订单支付、订单取消,这三个事件虽然都是订单域的,但下游关心的是不同环节,实时大屏要看支付成功转化率,风控要看取消率,它们各自只关心其中一类消息,所以分开建三个主题更合理。相反,用户基础属性更新、用户扩展属性更新这两个事件,如果下游总是需要同时拿到并结合处理,就可以考虑合并成一个主题。
3.3 兼容性:版本化命名策略
数据总线必然会面临数据格式升级的问题。生产者改了消息体结构,加了字段,改了字段类型,下游如果直接反序列化,轻则报错,重则数据污染。这个问题只靠约定“沟通同步”是不可靠的,必须在命名层面留好后路。
常用的方案是主题版本化:主题名中隐式或显式带上V1、V2这类版本标识。比如order.binlog.order_info.upd.v1,升级后新数据写到order.binlog.order_info.upd.v2,下游可以根据自己的进度选择消费哪个版本的主题。等到所有消费者完成迁移,V1主题再下线删除。
这有一个副作用:版本化会让主题数量变多,因为同一类数据可能有多个并行版本。所以版本化策略一般只对关键链路使用,次要数据尽量做到向后兼容(新增可空字段、不改老字段类型),减少版本割裂。
3.4 Schema管理与兼容性校验
主题名只是第一层契约,消息体本身的格式是第二层契约。如果主题名叫得很漂亮,但里面消息体格式五花八门——有的是JSON,有的是二进制,有的JSON里嵌套结构天天变,总线治理依然无从谈起。
建议的做法是引入统一的Schema管理机制。简单的场景,可以维护一个内部Schema仓库,每种数据格式在这里做登记;复杂的场景,可以引入通用Schema注册表,生产者写入前先校验格式,消费者读取前先拉取Schema定义。这样做的好处是消息格式的可演进性:新增字段不会破坏老消费者,删改字段必须显式升级版本。
我在模拟项目中采用了一个务实路线:不需要引入重型注册表,先由数据平台团队维护一份所有主题的Schema文件清单,用版本号+示例消息的方式沉淀在仓库中。每次生产者变更消息格式,必须提交变更记录,评审通过后才能上线。这套流程虽然是人肉操作的,但在团队规模小于20人时完全够用,关键是“先有规则,再谈工具”。
4. 实操过程:从零搭建一套数据总线
4.1 技术选型与部署规划
数据总线的底层中间件选型,决定了整个系统的性能和运维模式。我这次选用的是开源社区最主流的Kafka作为总线内核,选了3个节点组成集群,配置为单副本,单节点磁盘分配1TB,保留策略设72小时。
为什么用Kafka而不是直接用Redis做消息转发?核心区别在于可靠性和回溯力。Redis的Pub/Sub模型数据不落地,消费端离线就丢消息;Kafka基于日志的存储模型天然具备持久化和位点管理能力,更符合数据总线对“可靠传输”的要求。
部署时需要注意一个细节:Kafka的性能强依赖操作系统页缓存,所以分配给Kafka进程的JVM堆内存不需要太大(一般4-6GB足够),省下的内存交给OS做页缓存,反而能显著提升读写吞吐。很多初次部署的团队把十几G内存都丢给JVM,结果GC频繁,吞吐完全上不去。
4.2 创建主题与参数选择
主题的合理参数,很大程度决定了上层使用体验。我按经验总结了一个参数速查表:
| 参数项 | 推荐值范围 | 选择逻辑 |
|---|---|---|
| 分区数 | 3-12个 | 分区数越大并行度越高,但分区数过多会带来文件句柄压力和重平衡耗时 |
| 副本数 | 2-3 | 生产环境至少2个副本,本模拟项目单副本够用;追求高可用建议3副本 |
| 保留时间 | 24-168小时 | 按下游最大允许延迟和数据重要性综合确定 |
| 消息大小上限 | 1-10MB | 业务事件普遍很小,但binlog大事务可能超过默认值,要按业务上限评估 |
分区数怎么定,我提供一个计算思路。先估算该主题峰值时每秒消息量,比如每秒2000条,单消费者实例每秒能处理500条,那至少需要4个分区才能让4个消费者实例并行扛住。再考虑到高峰期可能翻倍,建议分区数设为6-8个,留有一定冗余。
创建主题时还要注意批量参数。Kafka的性能与批量写高度相关,生产者端的batch.size、linger.ms直接影响写入吞吐。如果每条消息都是几十字节的小消息,建议把batch.size调大到32KB以上,linger.ms设置为10-20毫秒,把大量小消息攒成一个批次发送,吞吐能有几倍提升。
4.3 生产端接入流程
生产端接入数据总线,不建议让各个业务团队各自写一套生产者代码。更靠谱的方式是平台团队提供一个统一的生产客户端SDK,把配置项收敛起来,业务团队了解最基本API即可。
我在模拟项目中给上游业务提供的是一个轻量的HTTP上报接口(内网),业务系统只需要往这个接口POST消息体,底层由平台服务统一转发到Kafka对应主题。这么做有工程上的考量:业务团队不想引入一套新的消息队列依赖,用HTTP上报接入成本最低。但HTTP带来的额外IO开销不可忽视,所以这台网关服务需要做充分的连接复用和线程池调优,同时按业务方设置独立的额度控制。
对于高吞吐的日志类数据,HTTP的方式就不太合适了。日志采集通常走的是日志Agent直写总线,利用批量压缩的方式把日志文件内容批量发送到指定主题。这个模式下,重点要关注的是数据压缩率——日志文本的压缩率一般能到10:1以上,不开压缩的集群,再大的磁盘也扛不住日志洪水。
4.4 消费端实践与消费组管理
消费端接入的合理方式,是由平台团队搞定“数据怎么来”,业务团队只管“拿到数据做什么”。所以消费端SDK通常封装了:位点自动提交、断线重连、反序列化扩展、监控上报这几个默认能力。
消费组管理是实操中最容易踩坑的环节。一个消费组就是一个应用集群,同一个应用的不同实例必须使用同一个组名。如果出现了配置不一致——有些实例配置组名A,有些实例配置组名B——数据就被重复消费了。这类故障的特征是:日志里没报错,但数据库里的数据统计翻倍。排查时优先看总线监控上消费组列表,所有实例是否归于同一组。
位点提交的时机同样关键。我强烈建议使用手动提交位点,并保证“业务处理完成之后才提交位点”。如果是自动提交,默认5秒提交一次,任务处理到一半宕机,恢复后会从上一次提交的位置开始消费,中间这段数据就丢了。虽然Kafka的At Least Once语义下消息可能重复,但手动提交能把丢失窗口缩到最小。
4.5 监控与告警体系搭建
数据总线跑起来之后,马上要搭一套监控体系。没有监控的总线,就像没有仪表的飞机,飞得再高也不知道什么时候会失控。
核心监控指标分三层:
物理层指标:节点CPU、内存、磁盘IO、磁盘使用率、网络吞吐。磁盘使用率是最常见的告警源,超过85%要预警,超过90%要立即介入。因为Kafka一旦磁盘满,写不入、读不出,整个集群的可用性会瞬间崩掉。
主题层指标:每个主题的消息生产速率、消费速率、生产堆积量、Lag(消费落后量)。Lag不等于故障,但如果某个消费组的Lag持续增长,说明消费者处理能力跟不上数据产生速度,需要扩容消费者实例或者优化处理逻辑。
链路层指标:消息从生产到被消费的端到端延迟。这个指标最贴近业务感受:实时大屏上如果看到数据延迟超过1分钟,业务方肯定不满意。可以在消息体中嵌入生产时间戳,消费端算出延迟,上报到监控体系里按主题聚合。
告警规则我建议按“三级联动”设置:第一级是告警,比如磁盘使用率超过阈值,通知平台值班人员;第二级是严重告警,比如主题生产速率突降到0,说明来源端故障,立即通知对应业务团队;第三级是通知,比如Lag轻度反弹超过10分钟,邮件等方式知会即可,避免告警疲劳。
5. 常见问题与排查手段实录
5.1 消费端Lag一直涨怎么办
Lag上涨是数据总线运维中最常见的问题,处理起来也最考验基本功。
被忽略的第一件事是确认Lag涨的主语是谁。打开监控,观察具体是哪个消费组的Lag在涨,对应哪个主题,同时观察该主题的消息生产速率有没有突变。如果生产速率翻倍了,可以优先扩容消费者实例来平衡;如果生产速率没变化,那就是消费端处理卡住了。
消费端卡住的两个高频根因,一个是数据库写入慢,消费逻辑在提交位点前卡在数据库操作上,另一个是消费消息后的外部API调用超时没有设置兜底。排查时用线程栈转储看一下消费者的线程状态就能快速定位。我在实际操作中养成了一个习惯:所有消费处理逻辑里,任何外部依赖都必须有超时时间,而且必须设线程池的拒绝策略,防止单条慢消息拖垮整个消费组。
还有一个隐蔽的坑:某个分区无人消费。一个消费组里如果有消费者实例重启后频繁触发重平衡,会造成部分分区短暂无人消费,Lag看起来也在涨。这种要检查消费者实例的会话超时设置是否过于激进,以及心跳间隔和最大拉取间隔的数值是否搭配合理。
5.2 编写如果主题分区键选择错误导致的数据乱序
数据乱序是实时计算里最难查的问题,因为它不会报错,只是结果看起来不对。最典型的场景是:同一笔订单,先收到了完成事件,后收到了创建事件,下游按事件顺序覆盖状态,结果把完成状态覆盖回了初始状态。
原因几乎都出在分区键的设计上。分区的语义是:同一分区内的消息有序,跨分区的消息不保证有序。如果你的主题分区键没有按业务实体区分(比如按消息类型区分、按时间戳取模区分),那么同一个订单ID的消息很有可能被分散到多个分区,顺序自然就乱了。
修复思路分两步:第一步,把消息的分区键改为业务实体的唯一标识(订单事件用订单ID、用户事件用用户ID);第二步,如果要进一步保障全局有序,可以把主题的分区数设成1,但这样会牺牲吞吐、增大单分区压力,除非业务对顺序的严格性大于对吞吐的要求,否则不建议。
另外,消费端的多线程并发处理也会破坏顺序。即使生产者把消息顺序写好了,消费者拿到的同一分区消息如果用多线程并发处理,快的事件可能先被处理完。对严格有序的业务,消费端必须单线程处理同一分区数据,或者按分区施加锁。这是很多人容易忽略的末端环节。
5.3 消息重复消费与幂等设计
Kafka的语义是至少一次,不是精确一次。换句话说,消息重复是常态,不是异常。架构上必须默认消息可能重复,然后靠消费端做幂等处理来兜底。
做幂等的常见手段有:数据库表对业务唯一键做去重约束;Redis利用SETNX做消息ID去重,处理前先判断是否处理过;或者用目标系统的状态机做幂等,只有满足前置状态才允许更新。三者根据实际业务场景灵活选型。
我见过很多团队问:Kafka不是支持事务吗?能不能用事务保证精确一次?事务性Kafka可以保证生产端写多个主题原子性,但消费端的精确一次需要把消费位点存储和应用处理结果放在同一个外部事务里,实现起来非常重,对大多数业务团队而言不划算。所以务实的建议仍然是“可靠传输 + 消费幂等”,这套组合足以覆盖绝大多数业务场景。
5.4 数据总线集群数据倾斜问题
数据倾斜表现为:某个Broker节点的磁盘占用率明显高于其他节点,或者某个分区消息量远大于其他分区,导致消费并行度分配不均匀。
倾斜的第一个层次是节点倾斜,多体现在日志类数据。日志消息量受业务时段影响波动巨大,比如晚间大促活动期间,某些日志主题的生产量是平时的几十倍,连接数全打在一个节点上。缓解方式是使用Kafka的机架感知或分区迁移工具,把热分区手动重分配给不同节点。但不能只做一次,因为数据热度是会漂移的,要注意观测。
倾斜的第二个层次是分区倾斜,多体现在业务事件类数据。分区键选择不当导致某个分区的数据明显多于其他分区,比如订单事件按商户ID分区,但超级商户占了80%的单量,数据必然堆积。这种情况要考虑增加分区数量,同时在生产者端引入“二次分区”策略,即使热点键也要通过加盐分散到不同分区中。
实际处理还有一个容易被忽略的点:倾斜往往不是恒定的,而是阶段性的。大促时期出现倾斜,活动结束后自然缓解,所以要先判断倾斜是常态还是临时状态,不要一看到倾斜就迁分区,频繁迁移对集群稳定性伤害更大。
6. 数据总线治理与长期运维建议
6.1 主题生命周期与下线流程
数据总线长期运营,最怕的是“只增不减”的主题膨胀。新业务上线建了一批主题,业务下线了主题没人清理,久而久之集群上几百个主题有一半是僵尸主题,监控噪音大、管理成本高。
我给出的建议是建立标准化的主题下线流程:业务方提交下线申请,平台团队确认该主题所有消费组都已迁移或关闭后,先在总线上停掉写入权限,再观察一个保留周期(比如7天),确认没有消费者在尝试拉取数据,然后执行主题删除。
这个流程看起来繁琐,但可以规避一个很严重的风险:有些主题的数据是“低频但重要”的——平时不怎么产生数据,季度结算时突然大量写入。如果没有确认所有消费方都迁移完就贸然删除,等下一次数据产生时就接不到了。所以下线流程的设计原则是:宁可多观察一个周期,也不要删早了。
6.2 数据契约演进与版本管理
数据总线用久之后,消息格式的演进是必然的。字段改名、类型变更、废弃字段,都是常态。核心原则是:老生产者不改格式、老消费者不破版。
具体的操作节奏是这样的:先拉一个版本分支,新格式的消息发到V1.1版本的主题中;和老消费者做好兼容性评估;新消费者灰度消费新版本消息,输出结果和旧版本对比,数据抽样校验通过后,推动老消费者迁移;最后老版本主题停写、下线。
这个流程里最容易踩坑的是中间状态:新旧版本并行期间,老消费者如果收到了新版本消息,反序列化会异常。所以实践上一般建议至少保留一段时间的双写:新旧两个主题同时写入,消费者按自己的版本号各取所需,等数据校验通过后停掉旧主题的写入。这能最大化降低演进风险。
6.3 权限控制与团队协作规范
数据总线上的每个主题,本质上是某个业务的“数据资产”。没有权限控制的总线,任何一个团队都能往任何主题写入数据,任何一个消费组都能订阅所有消息,数据安全和数据质量都无从谈起。我建议按“主写从读”的权限模型来分配主题权限:业务方对属于自己领域的前缀主题有写权限,对所有主题有订阅读权限;平台团队拥有集群管理权限。
协作规范方面,除了权限,还要约定一个“主题申请评审”流程。每个新主题的创建,需要在平台登记申请,说明主题用途、数据格式、预期流量、保留周期。平台团队评审确认命名规范、不会有重复主题后,才执行创建操作。这套流程保证总线上的每个主题都是“登记过的”,而不是随手建的临时通道。
7. 实际感受与经验补充
做了这几期数据相关的内容,我越发体会到,数据总线这件事,技术上并不难,难的是把“命名”变成一种团队默契。总线上的主题名,就是数据资产的标签。标签清清楚楚,业务方用起来放心,平台方管起来省心。
最后分享一个小技巧:每年或每半年做一次总线健康体检,把所有主题按“近30天消息量”和“消费组数量”两个维度排序,你会很快发现那些消息量为0但还挂着的僵尸主题,以及那些被多个消费组盯着的热门主题——前者该清理,后者该考虑是否需要升级配置或拆分主题。这比平时盯着告警等出事更有意义。数据总线的价值,不在于它能把数据传得多快,而在于它让数据流动这件事变得有序、透明、可治理。这个有序,才是实时数据体系能够长期稳定跑下去的根基。