zookeeper由于其node path的唯一性,也具备实现分布式锁的天然条件。同时得益于其watch机制在实现起来更方便。
本文基于golang实现的zookeeper分布式锁,仅供参考。使用的第三方library是github.com/samuel/go-zookeeper/zk
.
GetLock:
GetLock相对来说比较复杂。
Zookeeper在create key的时候可以选择不同模式:
currPath, err := conn.Create(zkKey, nil, 3, zk.WorldACL(zk.PermAll))
第三个参数3表示flag, 有4中取值:
- 0:永久,除非手动删除
- 1:短暂,session断开则该节点也被删除
- 2:会自动在节点后面添加序号
- 3:Ephemeral和Sequential,即,短暂且自动添加序号
这里我们选择EPHEMERAL_SEQUENTIAL,EPHEMERAL的好处是说如果当前session断连了,那么过段时间他锁创建的key就会自动删除,就避免了死锁的问题。
SEQUENTIAL的好处是说此时zookeeper创建的节点是默认自增的,可以很方便的找到prev node path。
由于zookeeper节点的唯一性,创建节点有两种结果:
- success:创建自增节点成功
- err: 创建失败
创建自增节点成功后,我们会拿到创建的节点path&