2PC 的阻塞问题与缺陷
某电商平台在双十一高峰期,订单系统出现了大规模卡顿。
经过排查,原因是:数据库管理员在维护时重启了一台服务器,这台服务器恰好是 2PC 分布式事务的协调者。
结果:
- 参与事务的其他数据库节点,都处于"等待协调者指令"的状态
- 所有相关行的锁都没有释放
- 其他业务请求开始堆积
- 最终导致整个订单系统超时
这是一个典型的 2PC 协调者故障导致的级联阻塞问题。
【架构权衡】 2PC 的阻塞问题不是"小概率事件",而是在生产环境中必然会遇到的问题。任何选择 2PC 作为分布式事务方案的团队,都必须提前设计好协调者的 HA(高可用)方案,以及参与者的超时恢复机制。
一、问题背景
1.1 阻塞问题的定义
1.2 阻塞的触发条件
二、缺陷详解
2.1 缺陷一:协调者单点故障
协调者故障恢复的困境:
2.2 缺陷二:同步阻塞
2.3 缺陷三:数据不一致
2.4 缺陷四:无法处理并发
三、解决方案
3.1 协调者高可用(HA)
3.2 参与者超时处理
3.3 三阶段提交(3PC)
3PC 是 2PC 的改进版本,通过增加一个阶段来减少阻塞:
3PC 的改进:
- 减少了参与者的阻塞时间
- 协调者崩溃时,参与者可以主动询问其他参与者
- 但仍无法完全避免数据不一致问题
【架构权衡】 3PC 虽然减少了阻塞,但增加了网络往返次数,延迟更高。而且在极端网络分区情况下,仍可能出现不一致。因此 3PC 在生产环境中很少使用。
四、工程代价评估
五、替代方案
六、落地 Checklist
- 协调者 HA:使用 ZooKeeper/Raft 实现协调者选举
- 超时配置:设置合理的 PREPARE/COMMIT 超时时间
- WAL 持久化:协调者和参与者都要持久化事务日志
- 恢复流程:设计并测试协调者和参与者的崩溃恢复
- 监控告警:监控超时事务、阻塞资源
- 替代评估:评估 TCC、Saga 等替代方案