zoukankan      html  css  js  c++  java
  • 基于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

  • 相关阅读:
    flex布局知识总结
    js,ts操作dom总结
    编译原理 语法树 句柄 简单短语 短语
    linux基础命令期末考试总结
    arm汇编指令--str ldr
    npm常用命令(原创)
    JS获取图片的缩略图
    Spring MVC 返回Json IE出现下载
    jquery获取页面iframe内容
    MySQL 下 ROW_NUMBER / DENSE_RANK / RANK 的实现
  • 原文地址:https://www.cnblogs.com/renhongwei/p/8806840.html
Copyright © 2011-2022 走看看