一、数据契约基础:什么是数据契约、为什么需要数据契约、数据契约的核心要素
1.1 什么是数据契约?说白了就是“数据界的接口规范”
我先问个问题:你做过微服务开发吧?服务之间调用要定义接口,要约定入参、出参、超时时间。那数据流转呢?
我见过太多团队,数据生产者随便改个字段类型,下游消费方直接崩了。数据契约,就是给数据流转也定一套接口规范。
用一句话概括:数据契约是数据生产方和消费方之间,关于数据格式、语义、质量、时效性的书面约定。
它不是什么新概念。早在SOA时代就有服务契约,数据契约只是把这个思路搬到了数据层面。但实时特征场景下,它的重要性被放大了十倍。
核心定义:数据契约 = 数据提供方承诺“我产什么、怎么产、多快产” + 数据消费方承诺“我用什么、怎么用、用多少”。双方签字画押,谁违约谁负责。
举个例子。你在做实时推荐特征,需要用户最近5分钟的点击行为。数据契约会写明:
- 字段:user_id(string)、item_id(string)、click_time(timestamp)、page_type(int)
- 延迟:从事件发生到数据就绪,不超过30秒(P99)
- 质量:user_id 非空率 ≥ 99.9%,click_time 不能是未来时间
- 可用性:每天 99.5% 的时间可消费
嗯,这就是一份典型的数据契约。它把“模糊的信任”变成了“可量化的承诺”。
1.2 为什么需要数据契约?我踩过的坑告诉你答案
说实话,我早年做实时数仓时,根本不知道什么叫数据契约。结果呢?
第一个坑:字段改了,没人通知
我记得有一次,上游把 order_status 从 int 改成了 string,没发任何公告。下游的实时特征计算任务直接抛异常,线上推荐效果掉了一大截。排查了整整三个小时,才发现是字段类型变了。
第二个坑:数据延迟了,消费方还在傻等
实时特征对时效性敏感。上游 Kafka 集群挂了,数据延迟了 10 分钟,下游的实时规则引擎还在用旧数据做决策。结果呢?误判了一堆用户行为,运营活动效果惨不忍睹。
第三个坑:数据质量没人兜底
我曾经接手过一个实时特征项目,user_id 字段偶尔会出现空值。下游模型训练时直接报错,但没人知道这个空值是谁产生的、什么时候产生的、该谁修。
这三个坑,本质上都是同一个问题:数据生产方和消费方之间没有明确的契约。
数据契约能解决什么?我列一下:
| 痛点 | 没有契约的后果 | 有契约的解法 |
|---|---|---|
| 字段变更 | 下游任务崩溃,排查耗时 | 契约版本管理,变更前通知所有订阅方 |
| 数据延迟 | 实时决策基于过期数据 | 契约约定 SLA,超时自动告警/降级 |
| 数据质量 | 脏数据污染下游,无人认领 | 契约定义质量指标,自动校验+责任到人 |
| 依赖混乱 | 不知道谁在用我的数据 | 契约注册中心,消费方必须订阅 |
我的经验:数据契约不是用来“限制”团队的,而是用来“保护”双方的。生产方不用担心被投诉,消费方不用担心被坑。说白了,它是数据治理的“安全带”。
1.3 数据契约的核心要素:一张图讲清楚
一份完整的数据契约,至少包含五个要素。我习惯把它们分成“承诺层”和“治理层”。
下面我逐个拆解。
1. Schema 定义
这是最基础的部分。数据长什么样?字段名、数据类型、是否必填、默认值、枚举范围。实时特征场景下,我建议用 Avro 或 Protobuf 做 Schema 定义,天然支持兼容性检查。
// 一个实时用户行为特征的 Schema 示例(Avro 格式)
{
"type": "record",
"name": "UserClickFeature",
"fields": [
{"name": "user_id", "type": "string", "doc": "用户ID,不能为空"},
{"name": "item_id", "type": "string", "doc": "物品ID"},
{"name": "click_time", "type": "long", "doc": "点击时间戳(毫秒)"},
{"name": "page_type", "type": "int", "default": 0, "doc": "页面类型:0-首页,1-详情页,2-搜索页"},
{"name": "duration_ms", "type": "int", "default": 0, "doc": "停留时长(毫秒)"}
]
}
2. SLA 承诺
实时特征最敏感的就是延迟。SLA 里要写明:
- 延迟:从事件发生到数据可消费,P99 不超过多少秒
- 可用性:数据链路全年可用时间占比(比如 99.9%)
- 吞吐量:每秒能处理多少条事件
我曾经踩过的坑:只写了平均延迟,没写 P99。结果平均延迟 5 秒,P99 延迟 2 分钟。下游实时模型在高峰期频繁拿到过期数据。后来我强制要求 SLA 必须包含 P99/P95 指标。
3. 质量约束
数据质量不是“尽量好”,而是“可量化”。常见的质量约束包括:
- 非空率:关键字段(如 user_id)非空率 ≥ 99.9%
- 唯一性:主键不能重复
- 值域:枚举值必须在合法范围内
- 时序:时间戳不能是未来时间,不能乱序超过 N 秒
4. 生命周期管理
数据契约不是写一次就完事了。它需要版本管理。我习惯的做法:
- 每个契约有唯一 ID 和版本号
- 变更必须走审批流程,通知所有订阅方
- 废弃的契约要有下线计划,给消费方缓冲期
5. 治理与合规
最后,谁对这个契约负责?谁审批变更?谁监控 SLA 达标情况?这些都要写清楚。我建议每个契约至少指定一个“数据 Owner”和一个“技术 Owner”。
我的习惯:治理层里再加一条“消费方承诺”。消费方不能无限制地拉数据,要约定使用频率、用途、数据保留时长。双向承诺才是真正的契约。
1.4 一个完整的契约长什么样?
我把上面五个要素拼起来,给你看一份完整的实时特征数据契约模板:
| 要素 | 内容示例 |
|---|---|
| 契约名称 | 实时用户点击行为特征 v1.2 |
| 数据生产方 | 用户行为采集团队(Owner: 张三) |
| 数据消费方 | 实时推荐团队(Owner: 李四) |
| Schema | Avro 格式,7 个字段,详见 Schema 仓库 |
| SLA | P99 延迟 ≤ 30s,可用性 ≥ 99.5%,吞吐量 ≥ 10w/s |
| 质量约束 | user_id 非空率 ≥ 99.9%,click_time 不能为未来时间 |
| 生命周期 | 版本 v1.2,变更需提前 3 个工作日通知 |
| 治理规则 | 每周 SLA 达标报告,连续 3 天不达标触发升级 |
嗯,看到这里你应该明白了。数据契约不是什么高深的理论,它就是一套“把话说清楚、把责任划明白”的规则。但就是这套规则,能帮你省掉无数个排查问题的深夜。