学习
SSOT · 信息系统持续生长

单一事实来源

Single Source of Truth · 单一事实来源

最后更新
2026年7月16日
概念连接
6

一句心智模型

一个事实可以有很多副本,但只能有一个地方被授权回答“现在是什么”。

视觉记忆卡

用一张图记住这个 Pattern。

把解释压缩成一个视觉模型,下一次在不同例子中遇到它时,也能更快识别出来。

下载原尺寸卡片
一份放在深色基座上的纸艺主记录分流到仪表盘、报告与缓存,表示一个权威来源生成多个派生视图。

01 · 漂移实验室

四份副本,只有一个可以定义事实。

切换健康发布链、被直接修改的派生物,以及两个同时自称权威的写入者。问题不是文件太多,而是写入所有权含糊。

一个权威源,可重复生成多个投影

源头前进到 version 4。所有下游表示沿一个方向重新生成,并记录同一个 source version。

健康流动
语义在这里权威源

Brain Markdown

source · v4

唯一可以发起内容修改的地方。

双语投影派生物

Public package

from v4

从源头生成,随时可以重建。

站点输入派生物

Blog copy

from v4

为发布应用准备的内容副本。

发布证据派生物

Production

main · v4

服务由发布链产生的已提交 revision。

物理副本可以很多,修正路径只有一条,而且没有歧义。

02 · 权威契约

四个问题都有答案,SSOT 才真正存在。

把文件命名为 canonical 只是承诺。周围的系统还必须让所有权、新鲜度与恢复路径都可以看见。

01authority

谁可以发起一次修正?

为这类有边界的事实,明确拥有者与唯一被接受的写入路径。

02direction

更新朝哪个方向流动?

除非领域真的需要多个写入者,否则优先单向生成。

03freshness

副本允许落后多久?

声明 source version、刷新触发条件与可接受延迟。

04recovery

怎样重新生成?

每个派生物都需要确定、可重复的恢复路径。

03 · 边界检查

“单一”这个词最容易制造三种误会。

SSOT 集中的是某类事实的裁决权。它不要求一个物理副本、一个数据库,也不假设权威拥有者永远正确。

物理存储

一个源,就只能有一份副本。

replica、缓存、报表与索引都应该存在;需要明确的是它们有没有权威。

系统设计

一个源,就是一个巨大数据库。

不同领域应该拥有不同事实。权威的单位有边界,而不是统治一切。

数据质量

权威源一定自动正确。

它仍然会错。SSOT 告诉所有人修改应该落在哪里,又怎样传播出去。

04 · 概念邻居

看清邻居是在拥有、追踪,还是投影这个事实。

周边概念分别解决权威问题的不同部分。它们的关系类型,比记住缩写更重要。

Canonical Source

权威机制

Canonical Source · 规范源

被正式选为权威的具体表示。

Lineage

来源追踪

Data Lineage · 数据血缘

沿着版本与转换,把一个投影追溯回源头。

Materialized View

派生投影

Materialized View · 物化视图

保存适合读取的结果;它可以落后,也可以重建。

Event Sourcing

实现模式

Event Sourcing · 事件溯源

把有序事件日志作为权威,再重放到各种视图。

CQRS

架构模式

Command Query Responsibility Segregation · 命令查询职责分离

把权威写入与为读取优化的模型分开。

SVOT

消费共识

Single Version of Truth · 单一版本的真相

让人们对一个定义或结果达成一致,而不是定位它的拥有者。

单一事实来源

Single Source of Truth(SSOT,单一事实来源)解决的是所有重复信息背后的同一个问题:当多个副本互相矛盾时,谁有权决定“现在是什么”?

它的答案不是“删除所有副本”。缓存、搜索索引、报表、replica(副本)、双语发布包和生产页面都很有用。这个 pattern 要做的是:让一个边界清楚的事实只有一个权威拥有者,其余表示都成为可追踪的派生物。

它要阻止的失败:drift

假设同一篇文章出现在四个地方:

source.md       version 3
public package  version 3
blog copy       version 4
production      version 3 + 一次手工 hotfix

四个版本看起来都合理。下一次同步却可能删掉最好的修改,因为没有人知道更新应该朝哪个方向流动。这就是 drift(漂移):本来应该一致的表示悄悄分叉。

一个健康的 SSOT 会明确四件事:

  1. 谁可以定义这个事实?
  2. 更新从哪里流向哪里?
  3. 一个派生副本允许落后多久?
  4. 分叉以后怎样重建或对账?

一个事实一个主人,不是所有东西一个数据库

Authority(权威)应该按事实或领域划分:

  • Order Service 拥有订单生命周期;
  • 身份系统拥有客户法定姓名;
  • source Markdown 拥有一篇文章真正表达的意思;
  • 已提交的 main revision 拥有生产 release。

这些事实不需要住在同一个物理存储里。相反,把无关领域强塞进一个巨大数据库,可能让所有权更模糊。

一个很好用的判断题是:哪个系统有权发起一次修正? 其他系统可以读取、订阅、缓存、索引、翻译或投影这个事实,但不能悄悄成为第二个独立写入者。

一个实用发布链

权威源 ──► 公开内容包 ──► 站点副本 ──► 部署结果
在这里修改       派生          派生         发布证据

一个健康的派生物应该带有足够的 Data Lineage(数据血缘):

derived_from   = 源标识
source_version = commit / offset / version
generated_at   = 生成时间
refresh_policy = 每次提交 / 每五分钟 / 每晚
rebuild_path   = 可重复的命令或流程

最容易推理的默认结构,是单向、可重复地生成。A ⇄ B ⇄ C ⇄ A 这种环形同步会让每一方都可能成为权威,于是必须额外定义复杂的冲突语义。

一个服务例子

假设 Order Service 拥有订单状态。它发布更新事件,供搜索索引、分析表和推荐系统消费。

这些副本可以针对不同查询优化,也可以只有 eventual consistency(最终一致性)。但退款仍然必须询问 Order Service,因为它拥有完整交易历史。一个更快、更近的副本,不会因为方便就自动获得权威。

所以 SSOT 完全可以和复制、高读取吞吐同时存在:物理副本可以很多,权威不能含糊。

权威不等于永远正确

权威源仍可能包含 bug、错误录入或过期规则。SSOT 不会让它永不犯错;它让修复有方向:先修正拥有者,再重新生成或对账所有派生物。

如果没有这个方向,团队会在许多副本里分别打补丁,却永远无法确认修复是否完整。

分叉以后怎样恢复?

当两个副本都出现了看似有效的修改:

  1. 暂停会继续扩大分叉的写入或发布。
  2. 说清楚发生冲突的是哪一类事实。
  3. 根据所有权、完整性、时间线和审计证据确认权威。
  4. 把下游独有且正确的修改带回源头。
  5. 从修复后的源重新生成所有派生物。
  6. 增加 lineage、diff check、写权限或单向发布路径。

顺序很重要:先恢复 authority,再恢复 consistency(数据一致性)。如果不先选择裁判,同步只是随便让一个版本覆盖另一个。

它不是什么

  • 不是一个巨大数据库。 SSOT 关心有边界的权威,而不是物理集中。
  • 不是禁止副本。 缓存、replica、materialized view(物化视图)和报表本来就应该存在。
  • 不是自动保证正确。 它告诉我们一次修正应该发生在哪里。
  • 不是 Event Sourcing(事件溯源)。 事件日志可以实现 SSOT,但只是其中一种实现模式。
  • 不是 Single Version of Truth(SVOT,单一版本的真相)。 SVOT 强调消费者对统一定义或结果达成一致;SSOT 强调权威从哪里产生。

什么时候会变难?

离线优先协作、active-active(双活)多地域写入、network partition(网络分区),以及真正需要多个独立作者共同定义事实的系统,都会让简单的“单写者”模型变难。

这些系统仍然需要显式权威和冲突语义,只是可能通过 leader(领导者)、quorum(法定人数)、merge rule(合并规则)或 CRDT(Conflict-free Replicated Data Type,无冲突复制数据类型)来分布式地实现。“我们有多个写入者”不等于可以不定义分歧怎样解决。

最后记住五件事

  1. 一个事实可以有很多副本,但需要一个被明确命名的权威。
  2. 每个派生物都应该暴露 source、version、freshness 和 rebuild path。
  3. 业务不需要多写者时,优先使用单向、幂等的生成流程。
  4. 先修改源,再重新生成下游;直接编辑 projection(投影)会制造 drift。
  5. SSOT 让错误可以修复、可以审计,而不是让错误从此不可能发生。

概念连接

概念邻居

Canonical Source

权威机制

Canonical Source · 规范源

被正式选为某类事实权威表示的具体文件、存储或日志。

Data Lineage

来源追踪

Data Lineage · 数据血缘

记录数据来自哪里、经过哪些转换,以及由哪个源版本产生。

Materialized View

派生投影

Materialized View · 物化视图

为查询保存的派生表示;它可以落后,并且应该能从源头重新生成。

Event Sourcing

实现模式

Event Sourcing · 事件溯源

把按顺序排列的事件日志作为权威记录,通过重放构建当前状态。

CQRS

架构模式

Command Query Responsibility Segregation · 命令查询职责分离

把权威命令与读优化投影分开,同时引入明确的同步边界。

SVOT

消费共识

Single Version of Truth · 单一版本的真相

让消费者对一套定义或结果达成一致;它与确定权威位置相关,但并不相同。

证据路径

一手资料

订阅我的邮件通讯

用 AI 构建,分享真正有效的方法。订阅即可在新文章发布时收到通知。

无追踪。无垃圾邮件。纯粹内容。

© 2020-2026 Aaron Guo