基于zookeeper实现高性能分布式锁

实现原理:利用zookeeper的持久性节点和Watcher机制

 

具体步骤:

  1、创建持久性节点 zkLock

  2、在此父节点下创建子节点列表,name按顺序定义

  3Java程序获取该节点下的所有顺序子节点,并且按照从小到大的顺序排列

  4、取出最小的节点,如果该节点在所有顺序子节点列表中index等于0,代表成功获取到锁资源

    否则将给比当前节点还小的节点注册监听事件,利用Watcher机制动态观察节点的删除事件

  5、删除子节点即释放锁资源

 

具体细节可参考园友文章:https://blog.csdn.net/sunfeizhi/article/details/51926396

 

我模拟了多用户抢购下单的业务场景,从无锁到本地锁再到分布式锁做了一个分析,首先

 

1、无锁场景

 

 

2、本地锁场景

 

 

 

3、基于zookeeper建立分布式锁

 

 

模拟真实场景后,对什么时候该用锁的了解更清晰了一步,实际上非大型公司不一定要使用zookeeper来实现,只是我最近研究zookeeper底层原理时,注意到了zookeeper的主动通知特性,在建立节点时也会存储消费者的信息,对可重入机制、智能锁支持良好,这一点是eureka没有的

 

一般来说选择自己团队最合适的才是正确的,下一次我将使用redis来实现分布式锁,此方案综合考虑(团队技术人员整体水平)是非常适合的一种方案,虽然redis没有主动通知,但可以利用key的过期时间来实现

 

期间遇到的问题是对线程池底层原理掌握不充足,闹了个乌龙,在这个地方纠结了二十多分钟

我最初好奇为什么线程没有自动退出,检查代码也没有错误的地方,最后突然想起来我使用线程池来管理的线程,线程池核心概念即重用线程,所以当线程使用之后会归还给线程池,下次使用时从缓存中拿线程,这个地方我还是要好好记一记

 

 

阅读源代码请访问https://github.com/wade-zh/zkLocker

posted on 2018-04-12 11:52  東風missile  阅读(391)  评论(0编辑  收藏  举报

导航