zoukankan      html  css  js  c++  java
  • 分布式锁实现方式介绍和Zookeeper实现原理

     

    分布式锁实现的几种方式

        基于数据库实现分布式锁(表、数据库排他锁)

        基于缓存(redis,memcached,tair)

        基于Zookeeper实现分布式锁

    关注点:

        单点问题?(集群)

        失效时间?(锁的释放 VS 失效)

        非阻塞?(while自旋 || wacther通知)

        非可重入?(记录当前获得锁的机器的主机信息和线程信息;三种方式都是)

    根据不同的应用场景正确选择:

    ————————————————————

    从理解的难易程度角度(从低到高)

    数据库 > 缓存 > Zookeeper

    ————————————————————

    从实现的复杂性角度(从低到高)

    Zookeeper >= 缓存 > 数据库

    ————————————————————

    从性能角度(从高到低)

    缓存 > Zookeeper >= 数据库

    ————————————————————

    从可靠性角度(从高到低)

    Zookeeper > 缓存 > 数据库

    ————————————————————

    ZK分布式锁的实现

    ZK分布式锁之前有提过,有简单互斥锁、互斥锁、读写锁;互斥锁是在简单互斥锁的基础上进行了优化,防止羊群效应问题,直接根据事件通知下一子节点来获得锁;

    调整后的分布式锁算法流程如下:(优化为“等待前一个子节点删除通知”)

        1.客户端连接zookeeper,并在/lock下创建临时的且有序的子节点,第一个客户端对应的子节点为/lock/lock-0000000000,第二个为/lock/lock-0000000001,以此类推。

        2.客户端获取/lock下的子节点列表,判断自己创建的子节点是否为当前子节点列表中序号最小的子节点,如果是则认为获得锁,否则监听刚好在自己之前一位的子节点删除消息,获得子节点变更通知后重复此步骤直至获得锁;

        3.执行业务代码;

        4.完成业务流程后,删除对应的子节点释放锁。

    分布式锁的几种实现方式:http://www.hollischuang.com/archives/1716

    基于Zookeeper的分布式锁(源码分析):

    http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html

     
  • 相关阅读:
    huffman编码压缩算法(转)
    ReLU 和sigmoid 函数对比以及droupout
    分类中数据不平衡问题的解决经验(转)
    C++ 虚函数表解析
    const 和宏的区别
    static小结
    javascript技巧字典【转藏】
    七个心理寓言【转】
    购物车悬浮 + 购物数量显示
    好看的图标
  • 原文地址:https://www.cnblogs.com/itommy/p/10644555.html
Copyright © 2011-2022 走看看