使用Zookeeper实现分布式锁
2020-04-22 16:09:56来源:博客园 阅读 ()
使用Zookeeper实现分布式锁
zk实现分布式锁的3种方式
第1种
创建一个znode,如果创建成功,则获取到锁,操作完成,删除znode即可释放锁;
如果创建失败(抛出异常),说明锁被其它服务的线程持有,当前线程休眠一小会儿,之后重试,设置一个计数器,如果重试指定次数后还没有获取到锁,就放弃。
缺点:未获取到锁时重试多次,浪费资源
第2种
在1的基础修改,如果创建失败,说明锁已被其它线程持有,给zndoe加一个watcher,监听节点删除事件(释放锁),当前线程休眠,节点删除事件发生时唤醒等待的线程。
缺点:会发生惊群现象,如果多个服务同时等待、监听此节点,释放锁后多个服务的线程都会被唤醒,但只有一个服务的线程可以获取到锁,其它服务的线程刚醒来又要沉睡。
第3种
在2的基础上进行修改,先创建有序的znode,假设都放在/lock下;
获取/lock的子节点列表,如果列表中只有一个元素,这个元素肯定是刚刚创建节点,认为当前线程已获取到锁;如果列表中的元素数量>1,获取倒数第二个元素,监听它的节点删除事件。
有序节点,获取子节点列表时,子节点是按照由小到大的顺序排列的,比如 [order0000000000, order0000000001, order0000000002,...] ,刚刚创建的节点是列表的最后一个元素,监听前一个节点即可。
用一个变量保存列表的最后一个元素(自己创建的有序节点),操作完成后删除这个节点。
无论使用哪一种,创建节点的时候,一定要创建临时节点,避免获取到锁后机器故障,导致锁一直释放不了。
可以自己动手使用原生API实现zk的分布式锁,麻烦些;也可以使用现有的轮子Curator。
原文链接:https://www.cnblogs.com/chy18883701161/p/12739633.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- DES/3DES/AES 三种对称加密算法实现 2020-06-11
- SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后 2020-06-10
- Spring Boot 实现定时任务的 4 种方式 2020-06-10
- JSP+SSH+Mysql+DBCP实现的租车系统 2020-06-09
- Java实现的三种字符串反转 2020-06-09
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash