基于Zookeeper实现的分布式锁

本文介绍了如何利用Zookeeper的EPHEMERAL_SEQUENTIAL特性来实现分布式锁,详细阐述了GetLock和ReleaseLock的过程,避免了死锁,并讨论了watch机制在处理羊群效应中的作用。
摘要由CSDN通过智能技术生成

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&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值