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

  • 相关阅读:
    LPC1768基本输入输出GPIO使用
    LPC1768IAP(详解,有上位机)
    STM32_IAP详解(有代码,有上位机)
    ucos2.86的任务调度漏洞
    ucos任务优先级从64到256,任务就绪表的改变
    ucos互斥信号量解决优先级反转问题
    ucos信号量集源码分析
    ucos内存管理原理详解
    ucos队列的实现--源码分析
    ucos调度器详解
  • 原文地址:https://www.cnblogs.com/renhongwei/p/8806840.html
Copyright © 2011-2022 走看看