数据契约的组成要素:生产者、消费者、Schema、SLA、版本管理
数据契约不是一张纸,也不是一个文档。它是一组明确的约定,把数据交互的规则定死。我见过太多团队因为“数据格式变了没人通知”而炸锅,说白了就是缺了这份契约。
一个完整的数据契约,包含五个核心要素。少了任何一个,都可能埋坑。咱们一个一个拆开看。
生产者:谁在提供数据?
生产者就是数据的源头。可能是某个微服务、一个数据库变更捕获程序、或者一个定时任务。我习惯把生产者看作“数据的房东”——房子是你的,你有权决定怎么装修,但租客(消费者)得知道你的规矩。
生产者的职责很明确:
- 定义数据格式:字段名、类型、是否必填,这些都得说清楚
- 保证数据质量:不能三天两头给空值、乱码
- 遵守SLA:承诺多久更新一次数据,延迟了要提前告知
- 管理Schema变更:改字段要发公告,不能偷偷摸摸
消费者:谁在使用数据?
消费者是数据的接收方。可能是数据分析师跑报表、推荐系统读用户画像、或者另一个微服务做业务判断。消费者的核心诉求就一个:拿到我想要的数据,格式别变,别迟到。
消费者需要做什么?
- 声明数据需求:我需要哪些字段?什么频率?
- 处理兼容性:生产者改了Schema,你的代码能不能扛住?
- 反馈问题:数据不对要及时说,别等上线了才抱怨
你想想看,消费者如果什么都不管,只管拿数据用,那生产者改个字段名,消费者就崩了。所以契约里必须写明消费者的责任。
Schema:数据的“身份证”
Schema定义了数据的结构。字段名、类型、长度、枚举值、约束条件……这些都得写清楚。我见过最坑的Schema就是“字段名叫a、b、c”,鬼知道是什么意思。
一个合格的Schema应该包含:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| user_id | string | 是 | 用户唯一标识,UUID格式 |
| user_name | string | 是 | 用户昵称,最长50字符 |
| age | int | 否 | 用户年龄,0-150 |
| created_at | timestamp | 是 | 注册时间,UTC时区 |
Schema的版本管理特别重要。我习惯用Avro的Schema Registry,每次变更都生成新版本,消费者可以选择升级或者继续用旧版本。这样就不会出现“一改全崩”的情况。
SLA:数据服务的“军令状”
SLA(Service Level Agreement)是数据契约里最硬的部分。它规定了生产者必须达到的服务水平。没有SLA的契约,就像没有罚则的合同——写了也白写。
SLA通常包含:
- 数据新鲜度:数据多久更新一次?比如“每5分钟同步一次”
- 延迟上限:最晚多久必须送达?比如“不超过10分钟”
- 可用性:数据服务在线率?比如“99.9%”
- 数据质量:空值率、异常值比例的上限
举个例子:
{
"data_freshness": "5分钟",
"max_latency": "10分钟",
"availability": "99.9%",
"null_rate": "< 1%",
"penalty": "每次违规扣减当月服务费的5%"
}
版本管理:数据契约的“时光机”
数据契约不是一成不变的。业务在变,Schema在变,SLA也在变。版本管理就是让这些变更可控、可追溯。
我常用的版本管理策略:
- 语义化版本:主版本号(不兼容变更)、次版本号(兼容变更)、补丁号(小修小补)
- 变更日志:每次变更都要记录“谁、什么时候、改了啥、为什么改”
- 兼容性检查:自动检查新版本是否向后兼容,不兼容就拒绝发布
- 灰度发布:新版本先给部分消费者试用,没问题再全量推
你想想看,如果没有版本管理,生产者改了个字段类型,消费者完全不知道。等上线了才发现,那叫一个酸爽。版本管理就是给数据契约上了个保险。
五要素的关系
这五个要素不是孤立的。它们互相依赖,共同构成一个完整的数据契约体系。我画了张图,帮你理清关系:
从图里能看出来:
- 生产者和消费者是契约的两端,缺一不可
- Schema和SLA是契约的具体内容,一个管格式,一个管质量
- 版本管理贯穿始终,保证所有变更都有迹可循