知识卡片
分布式锁难以同时满足一致可用高并发
内容
分布式锁是观察CAP权衡的绝佳案例:Zookeeper实现靠Zab保证强一致高可用但QPS撑不住高并发,且心跳误判(网络抖动/Full GC)会导致锁提前释放、脑裂。Redis实现性能好但主从异步复制会在故障切换时丢锁状态,超时释放又会在执行超预期时错误释放。发散:两者失败点都是心跳/超时推测存活的固有缺陷,本质是[[网络2将军问题的不可解性]]的具体化,优先考虑规避分布式锁依赖。
参考来源
- 位置:第12章《CAP理论》12.3节「典型案例:分布式锁」(源文件:_epub-src/text/part0066.html)
- 结论依据:原文明确说明Zookeeper实现的分布式锁靠心跳探测客户端存活,网络超时或Full GC会误判导致脑裂;Redis实现异步复制会在故障切换时丢锁状态,超时释放又会在Full GC或业务超时时错误释放导致多进程持锁,直接支持卡片论述。
- 原始内容:"因为用心跳探测客户端是否宕机,当网络超时或客户端发生Full GC的时候会产生误判……锁被释放,然后被另外一个进程拿到,从而导致两个进程拿到同一把锁……Redis的主从之间采用的是异步复制,如果主宕机,则切换到从,会导致部分锁的数据丢失……如果客户端不是真的宕机,而只是因为Full GC发生了阻塞……锁被无条件释放,也会导致两个进程拿到同一把锁。"