13.2 数据产品、平台铺路与联邦治理:自治必须能够互操作
首批领域各发布了一张“产品表”,格式、身份键、时间语义和权限申请方式却完全不同。消费者要组合三张表,反而比过去更慢。问题不在领域自治,而在自治没有共同接口,平台也没有把正确路径做成默认路径。
本课目标
- 定义数据产品的接口、SLO 和生命周期;
- 设计平台的 self-service paved road;
- 把联邦规则转成模板、策略和验证证据;
- 用消费者结果而非产品数量衡量迁移。
1. 数据产品交付的是可消费能力
一份产品规范至少包含:
以下 YAML 是教学用自定义描述,不是某产品可直接执行的配置。table://、topic:// 和 registry:// 是示意标识,需要实际平台解析器与对应发布、策略和检查实现。
id: logistics.confirmed-supply-events
owner: logistics-domain
purpose: confirmed supply movement for operational and analytical use
interfaces:
batch: table://prod/logistics/confirmed_supply_events/v2
stream: topic://prod/logistics/confirmed-supply-events/v2
grain: one row/event per confirmed supply movement
keys: [supply_event_id]
event_time: confirmed_at
ingestion_time: ingested_at
available_time: published_at
schema_contract: registry://logistics/supply-event/v2
quality_slos:
freshness: consumer-agreed target
completeness: based on expected sites
classification: internal-sensitive
support: on-call route and issue tracker
deprecation: notice window and migration policy具体 SLO 不能从模板复制,要由消费者截止时间、失败成本和生产能力协商。对外 SLA 是否需要违约后果,取决于组织关系。
采集时间不等于可消费时间:记录到达平台后,可能仍在质量检查或等待事务提交,所以另设 published_at。该产品定义为不可变确认事件,纠正用新事件引用原事件;若接口改为可修改的状态快照,主键、版本和撤销规则也必须相应改变。
2. 产品的八类能力
- 可发现:目录、名称、术语和示例;
- 可理解:粒度、时间、单位、NULL 和状态语义;
- 可信:质量结果、事件状态和认证;
- 可寻址:稳定资产 ID 与接口;
- 互操作:共同身份、时间、schema 和策略约定;
- 安全:分类、用途、最小权限和审计;
- 有价值:明确消费者、决策和反馈;
- 可维护:owner、支持、版本、成本和退役。
不必把每个内部临时表都提升为产品。产品数量越多,支持、目录和兼容成本越高。
3. Contract 分开语法与语义
schema contract 约束类型、可空、枚举和兼容;semantic contract 说明粒度、单位、时间和业务规则;service contract 说明新鲜度、可用性、支持与变更。
兼容不只看 schema:
duration从分钟改成秒,类型没变但语义已破坏;- 状态
done重新解释为“结算完成”,枚举没变; - 历史数据回填改变过去指标,查询仍能运行。
因此变更检测需要机器规则与 owner/消费者评审。
一个具体兼容检查是:批表 v2 使用整数克,流接口 v1 使用十进制千克;在同一来源进度点比较事件集合与数值。以下标准库例子处理重放、排除进度点后的事件,并拒绝同 ID 冲突:
from decimal import Decimal
stream_v1 = [
{"offset": 1, "event_id": "logistics:1", "quantity_kg": "2.5"},
{"offset": 2, "event_id": "logistics:2", "quantity_kg": "0.5"},
{"offset": 2, "event_id": "logistics:2", "quantity_kg": "0.5"},
{"offset": 3, "event_id": "logistics:3", "quantity_kg": "9"},
]
batch_v2 = {"logistics:1": 2500, "logistics:2": 500}
def snapshot_in_grams(events, high_water):
result = {}
for event in events:
if event["offset"] > high_water:
continue
grams = Decimal(event["quantity_kg"]) * 1000
if not grams.is_finite() or grams <= 0 or grams != grams.to_integral_value():
raise ValueError("positive whole grams required")
key, value = event["event_id"], int(grams)
if key in result and result[key] != value:
raise ValueError("same event ID with conflicting content")
result[key] = value
return result
normalized = snapshot_in_grams(stream_v1, high_water=2)
assert normalized == batch_v2
print(sum(normalized.values()))
# 3000示例只有一个来源分区。真实批流对账需要每个分区的进度、快照提交 ID、修订与删除规则;不同时间各查一次“最新值”不能证明接口一致。单位适配也不应悄悄舍入,无法用整数克表示时要拒绝或明确精度契约。
4. 平台也要作为产品经营
平台消费者是领域产品团队。平台团队应观察他们从代码到安全发布需要多少步骤、失败在哪里,而不是只交付一堆基础设施组件。
一条 paved road 可以提供:
产品模板与仓库
schema/契约注册和兼容检查
部署、调度与环境隔离
质量 SLI、日志、血缘和目录注册
身份、访问策略和审计
成本、配额和资源建议
事件、回滚与退役工作流默认路径应安全且低摩擦,同时保留例外扩展点。强制所有场景使用同一计算引擎会把平台变成限制;允许无限自由则失去自助和互操作。
5. 联邦计算治理如何落地
共同规则可以分层:
全局不可协商
身份认证、敏感分类、审计最低字段、重大用途限制和事件响应。
互操作标准
资产 ID、时间格式、schema 版本、通用实体键和契约协议。
领域规则
业务枚举、质量阈值、发布频率、内部模型和支持细节。
把规则实现为:
- 模板和默认配置;
- CI 中的 schema/策略检查;
- 发布时访问与分类门禁;
- 运行时监控和审计;
- 带 owner、补偿控制和到期日的例外。
“计算治理”不是所有政策都能自动决定。含糊或价值冲突的情况仍需人裁决,系统负责提供证据和执行决定。
例如禁止未分类敏感字段发布:CI 校验字段分类是否齐全,发布器检查目标位置策略,运行时审计新写入与访问,例外控制验证到期。只在模板里放一个 classification 字段,无法阻止绕过模板的直接写入。平台需要把执行点放在实际发布和访问路径上。
6. 跨域身份与组合
产品可单独正确,却因实体键、事件时间和慢变维不一致而无法组合。优先建立少量共享能力:
- 全局/可映射实体标识;
- 主数据与身份解析;
- 事件时间、可用时间和时区约定;
- 参考数据版本;
- 跨域指标的组成与归属。
共享标准要解决真实消费问题,不能为了统一而建立无人采用的企业大模型。
7. 成本与激励
领域承担生产成本,收益却可能落在其他团队。若只按成本考核 owner,他们会减少共享;若平台完全免费且不可见,又会产生浪费。
需要:
- 显示生产、存储和消费成本;
- 为跨域公共产品提供共享预算;
- 把可靠性和消费者结果纳入领域目标;
- 对低价值、无消费者产品及时退役;
- 避免用查询量作为唯一价值指标。
8. 衡量是否真的改善
比“有多少数据产品”更有意义的指标:
- 消费者首次发现到成功使用的时间;
- 契约变更提前量与破坏性变更率;
- SLO 达成、事件恢复和重复事件;
- owner/消费者问题响应时间;
- 跨域集成所需手工映射数量;
- 平台 paved road 采用率和逃逸原因;
- 活跃产品、无消费者产品与退役时间;
- 每个业务结果的总成本。
指标要与迁移前基线比较,并防止领域通过拆分产品或隐藏事件优化数字。
9. 渐进迁移
1. 选一条有消费者的跨域价值流
2. 明确领域 owner、产品接口和当前基线
3. 平台补齐发布最痛的两三个步骤
4. 建立最小全局策略和例外机制
5. 双跑旧/新接口,验证语义与 SLO
6. 消费者迁移并提供反馈
7. 退役旧路径,复盘组织与平台缺口
8. 只在模式可复用后扩展下一领域不要预设 6、12 或 24 个月的通用阶段。节奏取决于现有平台、团队能力、风险和迁移范围。
常见误区
- 一张带 owner 的表就是数据产品:还缺接口、语义、SLO、支持和生命周期。
- 自助意味着没有平台支持:平台负责把复杂控制做成可用能力。
- 联邦意味着所有规则可选:全局底线和互操作约定仍需执行。
- 产品越多转型越成功:过度拆分会增加消费与维护成本。
练习
- 为一个事件数据产品补全语义、服务等级与安全契约。
- 画出领域团队从提交代码到发布产品的 paved road,并找出人工等待。
- 把三条治理政策分成全局、互操作和领域层,再定义执行点。
- 为首个试点选择五个消费者结果指标,而不是产品数量。
小结
Data Mesh 的自治必须通过稳定产品接口、共享平台能力和可执行治理变成互操作。真正的成功不是组织图变了,而是领域能更快、更安全地交付,消费者也更少依赖口头知识和人工协调。
最后一章进入隐私工程:无论数据由中央还是领域管理,都要控制收集、链接、访问、保留和发布造成的个人风险。