ZooKeeper 保证了数据的强一致性,  zk集群中任意节点(一个zkServer)上的相同znode下的数据一定是相同的。使用zookeeper可以非常简单的实现分布式锁,

其基本逻辑如下:

  1. 客户端调用create()方法创建名为“locknode/lock”的节点,需要注意的是,这里节点的创建类型需要设置为EPHEMERAL_SEQUENTIAL。
  2. 客户端调用getChildren(“lock”)方法来获取所有已经创建的lock节点的子节点,同时在这个节点上注册上子节点变更通知的Watcher。
  3. 客户端获取到所有子节点path之后,如果发现自己在步骤1中创建的节点是所有节点中序号最小的,那么就认为这个客户端获得了锁。
  4. 如果在步骤3中发现自己并非是所有子节点中最小的,说明自己还没有获取到锁,就等待,直到下次子节点变更通知的时候,再进行子节点的获取,判断是否获取锁。

释放锁的过程比较简单,就是删除自己创建的那个子节点即可。

 

附:分布式锁实现过程中考虑问题的思路:

1.锁何时独占

2.锁何时释放

3.锁占有或者释放的先后次序可能引起的问题(控制时序)

参考:

ZooKeeper典型使用场景一览
分布式

转载于:https://www.cnblogs.com/dailidong/p/7571239.html

基于ZooKeeper实现分布式锁相关推荐

  1. 基于 Zookeeper 的分布式锁实现

    1. 背景 最近在学习 Zookeeper,在刚开始接触 Zookeeper 的时候,完全不知道 Zookeeper 有什么用.且很多资料都是将 Zookeeper 描述成一个"类 Unix ...

  2. ieee39节点系统介绍_Java秒杀系统实战系列-基于ZooKeeper的分布式锁优化秒杀逻辑...

    本文是"Java秒杀系统实战系列文章"的第十六篇,本文我们将继续秒杀系统的优化之路,采用统一协调调度中心中间件ZooKeeper控制秒杀系统中高并发多线程对于共享资源~代码块的并发 ...

  3. 【Zookeeper】基于Zookeeper实现分布式锁

    1.概述 转载:基于Zookeeper实现分布式锁 1.1 为什么使用分布式锁 我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,我们往往采用synchronized或者Lock ...

  4. 基于ZooKeeper的分布式锁和队列

    分布式锁的几种实现: 1.zookeeper分布式锁,基于自增节点 2.Redis分布式锁,基于setnx命令, 基于Redis实现分布式锁:http://blog.csdn.net/daiyudon ...

  5. 基于Zookeeper的分布式锁

    实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...

  6. Zookeeper:基于Zookeeper的分布式锁与领导选举

    本文转发自技术世界,原文链接 http://www.jasongj.com/zookeeper/distributedlock/ 1.Zookeeper特点 1.1 Zookeeper节点类型 如上文 ...

  7. etcd 笔记(08)— 基于 etcd 实现分布式锁

    1. 为什么需要分布式锁? 在分布式环境下,数据一致性问题一直是个难点.分布式与单机环境最大的不同在于它不是多线程而是多进程.由于多线程可以共享堆内存,因此可以简单地采取内存作为标记存储位置.而多进程 ...

  8. 基于 Redis 的分布式锁到底安全吗?

    [完整版] 网上有关Redis分布式锁的文章可谓多如牛毛了,不信的话你可以拿关键词"Redis 分布式锁"随便到哪个搜索引擎上去搜索一下就知道了.这些文章的思路大体相近,给出的实现 ...

  9. redis使用sysc超时_基于redis的分布式锁实现

    随着业务越来越复杂,应用服务都会朝着分布式.集群方向部署,而分布式CAP原则告诉我们,Consistency(一致性). Availability(可用性).Partition tolerance(分 ...

最新文章

  1. python比较好的书籍推荐-推荐几本2019年初学者学习Python最佳书籍!
  2. oracle case when exists()
  3. python之路---03 整型 bool 字符串 for循环
  4. 模拟jquery链式访问
  5. 大型EAI项目中的ORACLE 数据库管理(ZT)
  6. .Net Remoting(基本操作) - Part.2 (转)
  7. 字符串经典题之扑克牌的大小
  8. golang http Specifically check for timeout error
  9. java 线程缓存_Java 实现缓存,一个线程存,一个线程取
  10. 今日恐慌与贪婪指数为91 贪婪程度有所缓解
  11. csdn markdown 的使用
  12. SQLAlchemy 基础知识 - (autoflush 和 autocommit)(relationship 和 backref)(flask migrate迁移数据)
  13. android组件的下拉回弹,转:Android可以下拉/上拉回弹的ListView原理
  14. Linux chapter test 9
  15. ASP.NET程序设计案例教程 pdf电子书
  16. axure插件安装360浏览器
  17. Windows 各平台远程桌面客户端
  18. iOS popViewController 失败
  19. 安卓-几种查看SHA1和MD5的方法
  20. 机器人开发--Odoo(OpenERP)

热门文章

  1. SLAM: SLAM基本流程—VSLAM扫盲之旅
  2. 关于python学习路线
  3. 专业计算机能力考试 技巧,全国专业技术人员计算机应用能力考试应试技巧
  4. html5手机端设置date,H5 input[type='date'] 优化 pc端和移动端的使用
  5. 浅析 React Fiber
  6. EventFlow.helper.js 事件流程控制
  7. QT qml---- loader使用方法
  8. 通过base标签实现全网页新窗口链接。
  9. Using jQuery to add a dynamic “Back To Top” floating button with smooth scroll
  10. 第十三天-迭代器、三元表达、字典生成式、生成器、递归