1. 数据契约概述:什么是数据契约、为什么需要数据契约、数据契约在数据同步中的角色
1.1 什么是数据契约
数据契约,说白了就是数据生产方和消费方之间的一份书面约定。
我习惯把它比作「API 接口文档的升级版」。API 文档只告诉你接口长什么样,数据契约还告诉你:数据长什么样、什么时候到、质量怎么保证、出了问题谁负责。
举个例子。你从订单系统同步数据到数仓,订单系统说「我每天凌晨 2 点推送前一天的全量订单」。但实际跑起来呢?
- 字段类型变了——「金额」从 decimal(10,2) 变成了 varchar(20)
- 数据延迟了——凌晨 2 点的推送拖到了早上 8 点
- 数据丢了——某天少推送了 3 万条记录
没有数据契约,你只能靠人工排查、邮件扯皮。有了数据契约,这些都在约定里写得清清楚楚。
数据契约的核心要素:
- 数据结构:字段名、类型、长度、是否必填、枚举值范围
- 数据量级:单次推送的行数范围、峰值 QPS
- 时效性:数据产生到可消费的最大延迟
- 质量指标:完整性、准确性、一致性、唯一性
- 异常处理:推送失败的重试机制、告警阈值、降级策略
我在项目中遇到过最典型的场景:业务方说「这个字段不会为空」,结果上线第一天就报了空指针。后来我们在数据契约里明确写了「非空字段必须校验,校验失败整批拒绝」,这才把问题堵住。
1.2 为什么需要数据契约
你想想看,数据同步最怕什么?
怕的是不确定性。
数据什么时候到?不知道。数据质量怎么样?不知道。字段改了谁通知你?没人通知。出了问题谁负责?互相推。
数据契约就是用来消除这些不确定性的。
| 没有数据契约 | 有数据契约 |
|---|---|
| 字段变更靠口头通知 | 字段变更走契约版本管理 |
| 数据延迟靠人工盯 | 延迟阈值在契约中定义,自动告警 |
| 质量问题事后排查 | 质量指标前置校验,事前拦截 |
| 责任边界模糊 | 生产方和消费方权责清晰 |
| 同步链路黑盒 | 契约驱动,链路可观测 |
我记得有一次,一个核心报表突然数据对不上了。排查了三天,最后发现是上游系统悄悄加了一个字段,导致下游解析错位。如果当时有数据契约,字段变更必须走契约审批,这种问题根本不会发生。
避坑指南:我曾经见过一个团队,把数据契约写成了「文档」,签完字就锁在共享文件夹里。结果半年后数据链路改了三次,契约一次都没更新。数据契约必须代码化、自动化,跟 CI/CD 流程绑定,变更即触发校验。
1.3 数据契约在数据同步中的角色
数据契约在同步链路里扮演什么角色?我总结了三句话:
- 上游的「紧箍咒」——约束生产方按约定格式、时效、质量提供数据
- 下游的「安」——消费方不用猜数据长什么样,契约就是唯一真相
- 链路的「仪表盘」——契约驱动监控,同步状态一目了然
来看一张图,你就明白了。
从这张图能看出来,数据契约不是挂在两边的「文档」,而是嵌入在同步链路中间的执行层。
数据从生产方出来,先经过契约校验:
- 字段类型对不对?
- 必填字段有没有空值?
- 数据量级在不在预期范围内?
- 延迟有没有超过阈值?
校验通过,数据才能到达消费方。校验失败,直接拦截并告警。
我的经验:数据契约最好在同步链路中以中间件形式存在,而不是让生产方和消费方各自实现一遍校验逻辑。这样既保证了校验的一致性,也降低了双方的接入成本。我在上一个项目中用 Flink 做契约校验中间件,每天处理上亿条数据,延迟控制在秒级。
嗯,这里要注意一点:数据契约不是万能的。它解决的是「约定」和「校验」的问题,解决不了「数据本身是否正确」的问题。比如业务逻辑算错了,契约校验不出来。但至少,它能保证你收到的数据跟约定的一致,不会出现「字段对不上、数据少一半、延迟没底线」这种低级错误。
说白了,数据契约就是给数据同步上了一道保险。有了它,你就不用每天提心吊胆地等数据了。