🌩 一、为什么很多系统越做越大,数据越不可信?
典型表现:
- 同一个字段在不同服务意义不同
- 接口传参随意扩展,没有版本管理
- 上游改了数据格式,下游直接挂
- 报表口径混乱
- 事件消息 schemas 演变无序
- “数据对不上”的问题频繁出现
- 新人搞不清每个字段的意义
最终形成:
数据黑洞:数据越来越多,但都不准确。
🧊 二、没有“数据契约”的系统会怎样?
数据契约缺失,会导致三类灾难:
灾难一:接口变更导致连环崩
上游随意新增字段,或修改字段语义,下游全部受到影响。
特别在事件驱动架构中,一个事件 20 个下游会消费。
没有数据契约时,
等于所有服务赤裸裸互相依赖。
灾难二:报表与实际业务不一致
典型情况:
- A 服务统计的是创建时间
- B 服务统计的是支付时间
- C 服务统计的是更新时间
- 同一个指标三个值,谁都不认错
灾难三:业务语义模糊,难以维护
数据字典缺失,字段含义随项目演变被扭曲,如:
status
type
flag
category
bizValue
没有契约,它们的意义随开发人员的理解而变化。
🧠 三、什么是“数据契约”(Data Contract)?
一句话:
数据契约是服务之间对数据格式、含义、变化规则的正式协议。
它包含:
- 字段名称
- 字段类型
- 字段含义(语义)
- 字段规则(约束)
- 字段变更策略
- 兼容性策略(Backward Compatibility)
有点类似:
- OpenAPI 规范
- Protobuf schema
- Avro schema
- Event Schema Registry
但契约不仅仅是 schema 文件,而是一套完整体系。
📘 四、数据契约体系包含哪些能力?
1)Schema Registry(契约存储中心)
所有字段定义、事件定义、接口数据结构信息集中管理。
包括:
- 版本
- 来源
- 字段描述
- 是否废弃
2)兼容性策略
数据结构的变化分三类:
| 变更类型 | 是否兼容 |
|---|---|
| 新增字段(可空) | ✔ 向后兼容 |
| 删除字段 | ✘ 会破坏下游 |
| 修改字段类型 | ✘ 强破坏性 |
| 修改业务语义 | ✘ 更危险 |
契约会强制检查变更是否合法。
3)审查流程(Contract Review)
每次接口变更必须经过:
- 产品确认
- 服务 owner 确认
- 数据治理组确认
- 兼容性检查
保证不会产生连锁灾难。
4)事件契约(Event Contract)
对事件驱动架构尤为重要:
- event_name
- event_version
- payload schema
- 触发规则
- 历史兼容策略
- 幂等规则
- 消费方列表
避免“事件变更导致全系统炸裂”。
5)数据字典(Data Dictionary)
确保全服务对字段语义一致。
🛠 五、一个企业真实案例:没有契约导致的“数据灾难”
某公司营销部门做数据大屏,发现用户数突然多了 30%。
结果:
- A 服务的“用户创建事件”新增了一个字段
- B 服务按新规则消费了事件
- C 服务按旧规则消费
- 数据不一致
最终用了三天时间查清楚:
是上游字段 semantic 发生变化,没人通知下游。
后来引入数据契约:
- 所有数据变更必须登记
- Schema 变化自动通知
- Dashboard 全部自动检查兼容性
- 事件版本管理
数据再没出现过类似事故。
🔚 六、结语
数据契约不是“规范”,而是大型系统的生命线。
它解决的是:
- 数据不可控
- 接口不可控
- 语义不可控
- 变更不可控
最终让系统从混乱 → 清晰 → 稳定。