ARC 2选择正确的一致性语义第 5–9 章
第二篇回顾 —— 选择正确的一致性语义(第 5–9 章)
第二篇建立了以业务不变量、失败窗口和验证方法为依据的集合选择过程。
本篇形成的认识
- Register 保留一个 key 的当前逻辑可见值;查询是本地视角。
- 并发 Register 候选值需要以确定性 total order 或满足交换律的 resolver 收敛。
- Lease 用 TTL 和 fencing token 表达有期限所有权,并要求外部系统拒绝旧 token。
- CRDT 允许节点本地更新,但 merge 需要可交换、可结合、幂等。
- 不满足可修复/可重建前提的状态,不应因为 API 方便而进入 DSM。
能力压缩矩阵
| 业务不变量 | 集合 | 分区期间 | 恢复后 | 验证重点 |
|---|---|---|---|---|
| 一个当前 hint | Register | 可能看到不同值 | 确定性 winner | 顺序交换仍同值;陈旧回源 |
| 有期限的唯一执行权 | Lease | 旧 holder 可能仍运行 | 新 token 成为有效 owner | 外部资源拒绝旧 token |
| 多节点本地更新可安全合并 | CRDT | 局部状态不完整 | merge 后同状态 | 交换、结合、幂等 |
| 事务事实或可靠历史 | 不采用 DSM 主存储 | 局部成功可能不可撤销 | 收敛无法补偿副作用 | 事务、幂等、审计、重放 |
本篇如何兑现 DSM 价值
第二篇用 Register、Lease 和 CRDT 承担三类常见协调语义,使业务团队可以复用已定义的冲突裁决、租期和合并机制。价值取决于集合语义与业务不变量是否匹配;业务团队仍负责写明分区后果、fencing 和权威事实来源。
评审时的五个问题
- 这个状态的权威来源是谁?
- 丢失时能否从 peer 或权威源恢复?
- 分区期间允许两个节点各自成功吗?
- 外部副作用如何被 fencing、幂等或事务保护?
- 哪条实际命令能够证明选定语义,而不是只证明代码可编译?
常见错误
| 错误 | 纠正 |
|---|---|
| 用 Register 模拟 Lease | 把 TTL、transfer 与外部 fencing 写进契约 |
| 用 CRDT 包装任意对象 | 先证明业务 merge 的代数性质 |
| resolver 读取时间或随机数 | 保持纯、确定,并用输入反转检查交换律 |
| 只测试 happy path | 注入旧 token、重复 delta、顺序变化和分区候选值 |
迁移练习
为优惠券剩余量、批处理 worker 所有权和页面浏览计数分别选择存储语义。若选择 DSM,写出失败窗口;若拒绝 DSM,说明需要的事务或历史保证。没有「三题都选 DSM」的加分项。
下一步
进入第三篇:把「最终一致」拆成成员视图、在线传播、漏失检测和 repair。