数据契约的组成要素:生产者、消费者、Schema、SLA、版本管理

数据契约不是一张纸,也不是一个文档。它是一组明确的约定,把数据交互的规则定死。我见过太多团队因为“数据格式变了没人通知”而炸锅,说白了就是缺了这份契约。

一个完整的数据契约,包含五个核心要素。少了任何一个,都可能埋坑。咱们一个一个拆开看。

生产者:谁在提供数据?

生产者就是数据的源头。可能是某个微服务、一个数据库变更捕获程序、或者一个定时任务。我习惯把生产者看作“数据的房东”——房子是你的,你有权决定怎么装修,但租客(消费者)得知道你的规矩。

生产者的职责很明确:

  • 定义数据格式:字段名、类型、是否必填,这些都得说清楚
  • 保证数据质量:不能三天两头给空值、乱码
  • 遵守SLA:承诺多久更新一次数据,延迟了要提前告知
  • 管理Schema变更:改字段要发公告,不能偷偷摸摸
我的经验: 生产者最好在代码里显式声明契约。比如用Protobuf或Avro定义Schema,而不是靠口头约定。我曾经接手一个项目,生产者说“字段名不会变”,结果上线第二天就把user_name改成了username,下游全部报错。

消费者:谁在使用数据?

消费者是数据的接收方。可能是数据分析师跑报表、推荐系统读用户画像、或者另一个微服务做业务判断。消费者的核心诉求就一个:拿到我想要的数据,格式别变,别迟到。

消费者需要做什么?

  • 声明数据需求:我需要哪些字段?什么频率?
  • 处理兼容性:生产者改了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,每次变更都生成新版本,消费者可以选择升级或者继续用旧版本。这样就不会出现“一改全崩”的情况。

核心原则: Schema只允许向后兼容的变更。比如新增字段可以,删除字段不行。如果非要删,那就开新版本,给消费者足够的迁移时间。

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%"
}
注意: SLA不能只写数字,还得有监控和惩罚机制。我曾经见过一个团队写了“99.9%可用性”,结果根本没监控,宕机了也没人知道。SLA必须可测量、可验证。

版本管理:数据契约的“时光机”

数据契约不是一成不变的。业务在变,Schema在变,SLA也在变。版本管理就是让这些变更可控、可追溯。

我常用的版本管理策略:

  1. 语义化版本:主版本号(不兼容变更)、次版本号(兼容变更)、补丁号(小修小补)
  2. 变更日志:每次变更都要记录“谁、什么时候、改了啥、为什么改”
  3. 兼容性检查:自动检查新版本是否向后兼容,不兼容就拒绝发布
  4. 灰度发布:新版本先给部分消费者试用,没问题再全量推

你想想看,如果没有版本管理,生产者改了个字段类型,消费者完全不知道。等上线了才发现,那叫一个酸爽。版本管理就是给数据契约上了个保险。

五要素的关系

这五个要素不是孤立的。它们互相依赖,共同构成一个完整的数据契约体系。我画了张图,帮你理清关系:

数据契约五要素关系图 数据契约 生产者 消费者 Schema SLA 版本管理 生产者定义数据,消费者使用数据,Schema和SLA是契约的核心内容,版本管理保证契约的演进可控

从图里能看出来:

  • 生产者和消费者是契约的两端,缺一不可
  • Schema和SLA是契约的具体内容,一个管格式,一个管质量
  • 版本管理贯穿始终,保证所有变更都有迹可循
我的建议: 刚开始做数据契约时,别追求大而全。先把生产者和消费者定下来,Schema写清楚,SLA设个基础值,版本管理用简单的v1、v2就行。跑通了再慢慢完善。我见过太多团队一上来就想搞完美方案,结果半年了还没落地。