4. 数据契约的SLA制定:可用性、新鲜度、完整性、准确性

数据契约签了,责任边界划清了,接下来就是最实在的部分——SLA(服务等级协议)。说白了,就是给数据质量定个“及格线”。没有SLA的数据契约,就像没有验收标准的合同,扯皮是迟早的事。

我个人习惯把数据SLA拆成四个维度:可用性(Availability)、新鲜度(Freshness)、完整性(Completeness)、准确性(Accuracy)。这四个维度基本覆盖了数据消费方最关心的点。下面我一个一个说。

核心观点:SLA不是越高越好,而是“够用就好”。定得太高,成本爆炸;定得太低,业务没法用。关键是在成本和业务需求之间找到平衡点。
数据契约SLA四维框架 数据契约SLA 可用性 新鲜度 完整性 准确性 💡 四个维度相互独立,但共同决定了数据产品的整体质量。建议每个维度单独设定SLA指标和阈值。 不要试图用一个“综合评分”掩盖某个维度的短板——那是在给自己埋雷。

4.1 可用性(Availability)

可用性,就是数据“能不能用”。数据表挂了、接口超时、任务跑不出来——这些都算不可用。我见过最惨的情况:某团队的数据管道每天凌晨3点跑,结果因为上游依赖的表没按时产出,整个链路断了,业务方早上9点开会时数据还是空的。

可用性SLA通常用“几个9”来衡量。99%和99.9%看起来只差0.9%,但背后的运维成本差了一个数量级。

可用性等级 年停机时间 适用场景
99%(2个9) 87.6小时 离线报表、非实时分析
99.9%(3个9) 8.76小时 日常运营数据、看板
99.99%(4个9) 52.6分钟 实时风控、在线推荐
我的建议:刚开始做数据契约时,别一上来就定99.99%。先定99%,跑通流程再说。我曾经有个项目,业务方张口就要4个9,结果运维团队为了这个目标花了3个月做容灾,最后发现业务根本用不上——他们的报表每天才看一次。

可用性SLA还需要明确“什么算不可用”。是数据完全不可读?还是延迟超过阈值?还是数据量低于某个百分比?这些细节必须在契约里写清楚,否则事后扯不清楚。

4.2 新鲜度(Freshness)

新鲜度,就是数据“多新”。业务方要的是“今天的数据”,还是“上一小时的数据”,还是“实时数据”?这个差别很大。

我习惯把新鲜度分成三个档次:

  • T+1(天级):今天看昨天的数据。最常见,成本最低。
  • 小时级:延迟在1小时以内。适合运营监控、实时报表。
  • 近实时(分钟级):延迟在5-15分钟。适合风控、推荐系统。

新鲜度SLA要写清楚“从数据产生到数据可用”的时间窗口。举个例子:

# 数据契约中的新鲜度SLA示例
sla_freshness:
  target: "T+1 08:00"
  description: "前一天的全量数据,在次日早上8:00前必须可用"
  exception: "如果上游数据延迟超过2小时,SLA自动顺延,但需通知消费方"
  measurement: "以数据表最新分区的时间戳为准"
避坑指南:我曾经遇到一个案例,数据生产方说“我们是T+1”,结果消费方理解成“每天凌晨1点数据就更新”。实际上生产方的T+1是“第二天中午12点前”。就这一个理解偏差,双方吵了两个月。所以新鲜度SLA一定要写具体时间点,别只写“T+1”。

4.3 完整性(Completeness)

完整性,就是数据“全不全”。数据量少了、字段缺失了、某些分区没跑出来——这些都算不完整。

完整性SLA通常用“数据行数对比”或“字段非空率”来衡量。举个例子:

完整性指标 阈值 说明
行数完整率 ≥99.5% 当日数据行数 / 预期行数(基于历史均值或上游计数)
关键字段非空率 ≥99.9% 例如:订单ID、用户ID等核心字段不能为空
分区覆盖度 100% 所有预期分区必须存在,不能有缺失

这里有个坑:“预期行数”怎么算?如果上游数据本身就有波动,用固定值做阈值会频繁告警。我个人的做法是:用过去7天的滚动均值作为基准,允许±5%的波动。超出这个范围才触发告警。

关键原则:完整性SLA要区分“硬性字段”和“软性字段”。硬性字段(如主键、业务ID)必须100%非空;软性字段(如备注、扩展属性)可以容忍一定比例的缺失。别一刀切。

4.4 准确性(Accuracy)

准确性,就是数据“对不对”。这是最难定义的维度。为什么?因为“对”的标准因人而异。

我通常把准确性SLA分成两类:

  • 技术准确性:数据格式正确、类型匹配、不违反约束。这个相对好衡量。
  • 业务准确性:数据值符合业务预期。这个需要业务方参与定义。

举个例子:

# 准确性SLA示例
sla_accuracy:
  technical:
    - "所有数值字段不能为负数(除非业务允许)"
    - "日期字段格式必须为 yyyy-MM-dd HH:mm:ss"
    - "枚举字段必须在允许值列表内"
  business:
    - "订单金额与支付系统对账差异 < 0.1%"
    - "用户活跃度指标与埋点数据偏差 < 5%"
  measurement: "每天运行数据质量检查任务,输出差异报告"
我的经验:准确性SLA最容易引发争议。我曾经有个项目,数据生产方说“我的数据是准的”,消费方说“你的数据不对”。最后发现,双方对“准”的定义不同——生产方看的是字段格式,消费方看的是业务逻辑。所以准确性SLA一定要双方共同定义,最好有具体的校验规则和验收标准。

4.5 SLA的监控与告警

SLA定好了,不监控等于白定。我个人习惯在每个数据管道的关键节点埋点,实时计算SLA达标情况。

一个简单的SLA监控流程:

  1. 数据产出时:记录时间戳、行数、字段统计信息
  2. 与SLA阈值对比:判断是否达标
  3. 不达标时:触发告警,通知生产方和消费方
  4. 记录SLA历史:用于月度复盘和SLA调整

告警级别我建议分三级:

级别 触发条件 响应要求
P0(严重) 数据不可用 / 关键字段大面积缺失 30分钟内响应,2小时内修复
P1(重要) 新鲜度延迟超过阈值 / 完整性略低于标准 1小时内响应,4小时内修复
P2(一般) 准确性偏差在可接受范围内 下一个工作日处理
避坑指南:别把所有告警都设成P0。我曾经见过一个团队,所有SLA违规都发P0告警,结果运维团队被告警淹没了,真正的严重问题反而被忽略。告警级别要跟业务影响挂钩,别一刀切。

4.6 SLA的迭代与调整

SLA不是一成不变的。业务在发展,数据量在增长,技术架构在演进——SLA也需要跟着调整。

我建议每季度做一次SLA复盘:

  • 过去一个季度的SLA达标率是多少?
  • 哪些SLA指标经常不达标?原因是什么?
  • 业务方对当前的SLA满意吗?有没有新的需求?
  • 技术团队有没有能力提升SLA?成本是否可接受?

复盘之后,双方坐下来重新协商SLA。该升的升,该降的降。别把SLA当成死规矩,它应该是活的。

总结一下:数据契约的SLA制定,核心是“四个维度、一个原则”。四个维度是可用性、新鲜度、完整性、准确性;一个原则是“够用就好,持续迭代”。别追求完美,先跑起来再说。