2019独角兽企业重金招聘Python工程师标准>>>

lock操作过程:

  • 首先为一个lock场景,在zookeeper中指定对应的一个根节点,用于记录资源竞争的内容

  • 每个lock创建后,会lazy在zookeeper中创建一个node节点,表明对应的资源竞争标识。 (小技巧:node节点为EPHEMERAL_SEQUENTIAL,自增长的临时节点)

  • 进行lock操作时,获取对应lock根节点下的所有字节点,也即处于竞争中的资源标识

  • 按照Fair竞争的原则,按照对应的自增内容做排序,取出编号最小的一个节点做为lock的owner,判断自己的节点id是否就为owner id,如果是则返回,lock成功。

  • 如果自己非owner id,按照排序的结果找到序号比自己前一位的id,关注它锁释放的操作(也就是exist watcher),形成一个链式的触发过程。

unlock操作过程:

  • 将自己id对应的节点删除即可,对应的下一个排队的节点就可以收到Watcher事件,从而被唤醒得到锁后退出

其中的几个关键点:

  1. node节点选择为EPHEMERAL_SEQUENTIAL很重要。
    * 自增长的特性,可以方便构建一个基于Fair特性的锁,前一个节点唤醒后一个节点,形成一个链式的触发过程。可以有效的避免"惊群效应"(一个锁释放,所有等待的线程都被唤醒),有针对性的唤醒,提升性能。
    * 选择一个EPHEMERAL临时节点的特性。因为和zookeeper交互是一个网络操作,不可控因素过多,比如网络断了,上一个节点释放锁的操作会失败。临时节点是和对应的session挂接的,session一旦超时或者异常退出其节点就会消失,类似于ReentrantLock中等待队列Thread的被中断处理。

  2. 获取lock操作是一个阻塞的操作,而对应的Watcher是一个异步事件,所以需要使用信号进行通知,正好使用上一篇文章中提到的BooleanMutex,可以比较方便的解决锁重入的问题。(锁重入可以理解为多次读操作,锁释放为写抢占操作)

注意:

  • 使用EPHEMERAL会引出一个风险:在非正常情况下,网络延迟比较大会出现session timeout,zookeeper就会认为该client已关闭,从而销毁其id标示,竞争资源的下一个id就可以获取锁。这时可能会有两个process同时拿到锁在跑任务,所以设置好session timeout很重要。

  • 同样使用PERSISTENT同样会存在一个死锁的风险,进程异常退出后,对应的竞争资源id一直没有删除,下一个id一直无法获取到锁对象。

转载于:https://my.oschina.net/91jason/blog/500503

zookeeper分布式锁的原理相关推荐

  1. SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 电商之14.0 Zookeeper 分布式锁实现原理

    分布式锁是控制分布式系统之间同步访问共享资源的一种方式. 下面介绍 zookeeper 如何实现分布式锁,讲解排他锁和共享锁两类分布式锁. 排他锁 排他锁(Exclusive Locks),又被称为写 ...

  2. 技术分享| 基于 Etcd 的分布式锁实现原理及方案

    1. 为什么选择 Etcd 据官网介绍,Etcd 是一个分布式,可靠的 Key-Value 存储系统,主要用于存储分布式系统中的关键数据.初见之下,Etcd 与 NoSQL 数据库系统有几分相似,但作 ...

  3. zookeeper 分布式锁原理

    zookeeper 分布式锁原理: 1 大家也许都很熟悉了多个线程或者多个进程间的共享锁的实现方式了,但是在分布式场景中我们会面临多个Server之间的锁的问题,实现的复杂度比较高.利用基于googl ...

  4. 分布式锁原理——redis分布式锁,zookeeper分布式锁

    首先分布式锁和我们平常讲到的锁原理基本一样,目的就是确保,在多个线程并发时,只有一个线程在同一刻操作这个业务或者说方法.变量. 在一个进程中,也就是一个jvm 或者说应用中,我们很容易去处理控制,在j ...

  5. 关于分布式锁原理的一些学习与思考:redis分布式锁,zookeeper分布式锁

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 作者:队长给我球. 出处:https://w ...

  6. zookeeper实现分布式锁的原理及具体使用案例

    zookeeper跟redis一样,也是基于内存的. 官网: http://zookeeper.apache.org/ zookeeper是分布式系统的协调服务,提供配置管理.分布式协同.命名的中心化 ...

  7. zookeeper 分布式锁_关于redis分布式锁,zookeeper分布式锁原理的一些学习与思考

    编辑:业余草来源:https://www.xttblog.com/?p=4946 首先分布式锁和我们平常讲到的锁原理基本一样,目的就是确保,在多个线程并发时,只有一个线程在同一刻操作这个业务或者说方法 ...

  8. redis cluster 分布式锁_关于分布式锁原理的一些学习与思考redis分布式锁,zookeeper分布式锁...

    首先分布式锁和我们平常讲到的锁原理基本一样,目的就是确保,在多个线程并发时,只有一个线程在同一刻操作这个业务或者说方法.变量. 在一个进程中,也就是一个jvm 或者说应用中,我们很容易去处理控制,在j ...

  9. zookeeper分布式锁原理及实现

    前言 本文介绍下 zookeeper方式 实现分布式锁 原理简介 zookeeper实现分布式锁的原理就是多个节点同时在一个指定的节点下面创建临时会话顺序节点,谁创建的节点序号最小,谁就获得了锁,并且 ...

最新文章

  1. C# 连接Oracle 11g 无需安装Oracle客户端
  2. 空车上路,Waymo拿下加州首个“真”无人驾驶许可证
  3. Android RecyclerView 性能优化总结
  4. 4.PromQL快速入门
  5. 部署xhprof监控php效率(linux版本)
  6. 网络采集库NCrawler
  7. C++ STL容器vector篇(五) vector容器常用初始化操作总结(一维/二维)
  8. PPT - 如何在PPT里面实现数字的随机抽奖?
  9. python中聚类和分类的区别_聚类与分类有什么区别?
  10. framework层Service的基础知识和常见问题
  11. [Eclipse经验] 如何导入XSD文件
  12. 计算机课翻转课堂教案,翻转课堂式教学
  13. 运动图像国际压缩标准-整理
  14. Linux时间同步(Fri Nov 16 12:12:13 Local time zone must be set--see zic manual page 2018)解决办法
  15. 通过腾讯云cos做视频点播服务
  16. 机器学习算法——集成学习1(个体与集成)
  17. 细说上帝视角游戏的快速创建
  18. 【面试准备】MySQL索引篇
  19. 阿里云ecs配置ssh
  20. 软碟通(UItraISO)使用教程

热门文章

  1. 公司app 从兼容Android 8.0 升级兼容9.0
  2. OpenCV3.0或OpenCV3.1的SVM操作
  3. Python矩阵处理库—Numpy库的基本使用
  4. ListView和GridView的缓存机制及measure过程
  5. Observer(订阅与发布)
  6. 新手Java程序员找工作更看重Java项目经验?
  7. Java复习(二)类与对象的基本概念
  8. 使用PHP发送邮件的两种方法
  9. 浙江人22条经典经商法则(转载)
  10. 【SpringBoot】在普通类中获取spring容器中的bean