单一事实来源
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 只是承诺。周围的系统还必须让所有权、新鲜度与恢复路径都可以看见。
authority谁可以发起一次修正?
为这类有边界的事实,明确拥有者与唯一被接受的写入路径。
direction更新朝哪个方向流动?
除非领域真的需要多个写入者,否则优先单向生成。
freshness副本允许落后多久?
声明 source version、刷新触发条件与可接受延迟。
recovery怎样重新生成?
每个派生物都需要确定、可重复的恢复路径。
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 会明确四件事:
- 谁可以定义这个事实?
- 更新从哪里流向哪里?
- 一个派生副本允许落后多久?
- 分叉以后怎样重建或对账?
一个事实一个主人,不是所有东西一个数据库
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 不会让它永不犯错;它让修复有方向:先修正拥有者,再重新生成或对账所有派生物。
如果没有这个方向,团队会在许多副本里分别打补丁,却永远无法确认修复是否完整。
分叉以后怎样恢复?
当两个副本都出现了看似有效的修改:
- 暂停会继续扩大分叉的写入或发布。
- 说清楚发生冲突的是哪一类事实。
- 根据所有权、完整性、时间线和审计证据确认权威。
- 把下游独有且正确的修改带回源头。
- 从修复后的源重新生成所有派生物。
- 增加 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,无冲突复制数据类型)来分布式地实现。“我们有多个写入者”不等于可以不定义分歧怎样解决。
最后记住五件事
- 一个事实可以有很多副本,但需要一个被明确命名的权威。
- 每个派生物都应该暴露 source、version、freshness 和 rebuild path。
- 业务不需要多写者时,优先使用单向、幂等的生成流程。
- 先修改源,再重新生成下游;直接编辑 projection(投影)会制造 drift。
- 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 · 单一版本的真相
让消费者对一套定义或结果达成一致;它与确定权威位置相关,但并不相同。
证据路径
