• 面试题解:基于 ZooKeeper 的分布式锁实现原理是什么?和Reids做分布式锁的区别?


    面试题解1:基于 ZooKeeper 的分布式锁实现原理是什么?

    顺序节点特性:

    使用 ZooKeeper 的顺序节点特性,假如我们在/lock/目录下创建3个节点,ZK集群会按照发起创建的顺序来创建节点,节点分别为/lock/0000000001、/lock/0000000002、/lock/0000000003,最后一位数是依次递增的,节点名由zk来完成。

    临时节点特性:

    ZK中还有一种名为临时节点的节点,临时节点由某个客户端创建,当客户端与ZK集群断开连接,则该节点自动被删除。EPHEMERAL_SEQUENTIAL为临时顺序节点。

    根据ZK中节点是否存在,可以作为分布式锁的锁状态,以此来实现一个分布式锁,下面是分布式锁的基本逻辑:

    • 客户端1调用create()方法创建名为“/业务ID/lock-”的临时顺序节点。
    • 客户端1调用getChildren(“业务ID”)方法来获取所有已经创建的子节点。
    • 客户端获取到所有子节点path之后,如果发现自己在步骤1中创建的节点是所有节点中序号最小的,就是看自己创建的序列号是否排第一,如果是第一,那么就认为这个客户端1获得了锁,在它前面没有别的客户端拿到锁。
    • 如果创建的节点不是所有节点中需要最小的,那么则监视比自己创建节点的序列号小的最大的节点,进入等待。直到下次监视的子节点变更的时候,再进行子节点的获取,判断是否获取锁。

    Java八股文面试/学习全家桶合集(点击传送)

    面试题解02:ZooKeeper和Reids做分布式锁的区别?

    Reids:

    1. Redis只保证最终一致性,副本间的数据复制是异步进行(Set是写,Get是读,Reids集群一般是读写分离架构,存在主从同步延迟情况),主从切换之后可能有部分数据没有复制过去可能会 「丢失锁」 情况,故强一致性要求的业务不推荐使用Reids,推荐使用zk。
    2. Redis集群各方法的响应时间均为最低。随着并发量和业务数量的提升其响应时间会有明显上升(公网集群影响因素偏大),但是极限qps可以达到最大且基本无异常

    ZooKeeper:

    1. 使用ZooKeeper集群,锁原理是使用ZooKeeper的临时顺序节点,临时顺序节点的生命周期在Client与集群的Session结束时结束。因此如果某个Client节点存在网络问题,与ZooKeeper集群断开连接,Session超时同样会导致锁被错误的释放(导致被其他线程错误地持有),因此ZooKeeper也无法保证完全一致。
    2. ZK具有较好的稳定性;响应时间抖动很小,没有出现异常。但是随着并发量和业务数量的提升其响应时间和qps会明显下降。

    总结:

    1. Zookeeper每次进行锁操作前都要创建若干节点,完成后要释放节点,会浪费很多时间;
    2. 而Redis只是简单的数据操作,没有这个问题。

     

  • 相关阅读:
    少儿编程--枚举算法
    PgSQL-内核特性-TupleTableSlotOps
    最强开源大模型面世:阿里发布Qwen2
    Cosmos 生态:构建可互操作的多链未来
    以可视化方式解释 Go 并发 - 通道
    说明书SMW200A信号发生器
    Mac安装redis,mysql
    【原创】C++中vector与remove()函数
    Flutter开发程序员兼职副业平台推荐
    全流量安全分析发现内部系统外联异常
  • 原文地址:https://blog.csdn.net/mf97532/article/details/125602411