分布式系统¶
分布式系统由多个并发节点组成,消息可能延迟、重复、乱序或丢失,节点会暂停、重启,网络还可能分区。没有一个观察者能瞬间知道全局状态。因此核心工作不是“调用 RPC”,而是在明确故障模型下建立可证明的顺序、一致性、持久性与可用性边界。
学习路径¶
- 时间、因果与全序:从 happened-before、逻辑时钟走到物理时钟不确定性。
- 复制与共识:理解 quorum、状态机复制、Paxos/Raft 与成员变更。
- 事务与隔离:区分原子提交、并发隔离和外部一致性。
- 分片与再平衡:比较范围、哈希、一致性哈希与迁移协议。
- 分布式存储:串联 GFS、Bigtable、Dynamo 等系统的设计取舍。
- 可靠性与可观测性:从故障预算、超时重试走到 trace 与灾难演练。
建模先于实现¶
每个协议都应先回答:
| 维度 | 典型选择 |
|---|---|
| 节点故障 | crash-stop、crash-recovery、Byzantine |
| 网络 | 同步、部分同步、异步 |
| 存储 | 易失、稳定存储、可能损坏 |
| 身份 | 固定成员、动态成员 |
| 安全性质 | 永远不能发生什么 |
| 活性性质 | 在哪些条件下最终会发生什么 |
“最终一致”“恰好一次”“高可用”若没有对象、范围和条件,都不是完整技术承诺。
一条贯穿全站的原则¶
网络超时只代表观察不到结果:
request may be lost
response may be lost
server may commit and crash before replying
client may time out while server is still running
因此重试、幂等键、去重状态、事务提交和可观测性必须共同设计。传输层可靠不等于业务操作只执行一次。