在分布式集群系统为什么需要分布式锁?
如下图所示,在分布式系统中,每台jvm都有一个 count,这个count在三个不同的jvm中,用户请求过来映射到哪个就操作哪个,这时候如果就需要给Count加上锁,以免产生重复。
这时候需要分布式锁:共享一个count
这样所有的jvm共用一个count,就不会让count产生重复。
Zookeeper实现分布式锁原理
使用zookeeper创建临时序列节点来实现分布式锁,大体思路就是创建临时序列节点,获取分布式锁,当执行完毕后关闭zookeeper来释放锁。
实现步骤:
多个Jvm同时在Zookeeper上创建同一个相同的节点( /Lock)
zk节点唯一的! 不能重复!节点类型为临时节点,
jvm1创建成功时候,jvm2和jvm3创建节点时候会报错,该节点已经存在。这时候 jvm2和jvm3进行等待。
jvm1的程序现在执行完毕后释放锁,关闭当前会话。临时节点不复存在了并且事件通知Watcher,jvm2和jvm3继续创建。
PS:zk强制关闭时候,通知会有延迟。但是close()方法关闭时候,延迟就小
如果程序一直不处理完,可能导致思索(其他的一直等待)。可以采用设置有效期的方式来解决
参考代码: