“CAP 定理的实际价值在于强迫设计者把"分区期间的行为"写进服务规格:拒绝哪些请求、降级到什么语义、愈合后如何收敛,都不再能含糊其辞。它解释了为什么基于多数派的共识与状态机复制系统在失去 q…”
形式陈述 ​
将服务建模为确定性状态机
并固定初始状态
完整服务语义还要固定客户请求标识、重试去重、命令何时视为提交、何时可对客户响应,以及快照恢复和成员重配置如何与日志连接。若要对外提供线性一致的读,还需额外的读取协议;“日志相同”本身不是完整的端到端规格。
直觉
与其不断同步整个状态,状态机复制让排序层先提供共同命令前缀,再由各副本在本地重放同一计算。它由此把“多台副本如何保持一致”分成两层:共识或原子广播负责决定顺序,执行层让确定性状态机从相同初态按该顺序运行。仅仅复制数据或周期同步快照不够;若命令顺序不同,即使每条命令本身合法,也可能得到不同状态。反过来,同一日志也无法消除执行过程中未被记录为输入的非确定性。
例子与边界
初始余额为 withdraw(12) 与 deposit(5) 若按不同顺序并带余额检查,会产生不同结果:先取款则取款失败、最终余额为
执行还必须保持确定性:读取系统时间、随机数或外部服务会引入非确定性,必须转化为已排序输入或通过协议协调。“多数副本存有某条日志”也不自动意味着客户端已看到线性一致结果;还需领导者提交规则、读取协议和会话处理。成员重配置必须纳入日志,并通过相交配置让安全证据跨成员视图延续,避免新旧配置各自决定冲突命令。
推论与应用
在最多
状态机提供确定性转移语义,复制日志提供共同命令前缀;Paxos、Raft与Viewstamped Replication是日志层的具体协议。状态机复制由此支撑高可用键值存储、配置服务、数据库元数据和区块链执行模型。
形式化验证可以把实现状态映射到“共同 committed 前缀 + 确定状态”的抽象机,并用精化关系说明选主、重试和快照等内部步骤不改变外部历史。模型检查适合在有限副本和有界状态下搜索不变式反例,协议特有的 ballot、term 或选举机制仍留在各协议页,本页只规定排序层到确定性执行层的接口。
对外实现线性一致性还依赖正确的请求应答边界、读路径与去重;快照和日志压缩则在不改变已执行命令历史含义的前提下降低恢复成本。
参考资料
- Fred B. Schneider, “Implementing Fault-Tolerant Services Using the State Machine Approach,” 1990.
- Leslie Lamport, “The Part-Time Parliament,” 1998.