50

ZooKeeper 分布式锁的代码实现

 5 years ago
source link: https://mp.weixin.qq.com/s/5T2XgRv_VaM65sUVVh9Qvw?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文涉及到几个zookeeper简单的知识点,永久节点、有序节点、watch机制。比较基础,熟悉的就别看了跳过这篇吧

6ZNrYjU.jpg!web

  • 每个线程在/locks节点下创建一个临时有序节点testlock0000000040

  • 获得/locks节点下所有子节点A、B、C,排序获得最小值

  • 若当前节点B为最小值则获得锁,执行业务逻辑

  • 若当前节点B不是最小值则watch比自己小1的节点A,节点A存在则await,否则获得锁

总结:创建临时有序节点排序后,watch比自己小1的节点等待获取锁。

UFVruaZ.jpg!web

下面看代码

1.线程初始化

创建一个名字为lockName的永久节点(只有永久节点才可以创建子节点)

复习一下:

zookeeper的节点有以下几种类型:永久,永久有序,临时,临时有序

2.线程尝试获得锁tryLock

创建临时有序节点,会在你的lockName后面加上一串编号,

例如:/locks/test_ lock_ 0000000035

获取当前lockName下的所有子临时节点

把名字都取出来放进list排个序

若当前节点为最小节点,则直接获取锁成功

若不是最小节点,开始等待,见下一步。

3.开始等待锁

获得当前线程需要等待的节点名

  • 获得当前节点的节点名即testlock0000000035

  • 获得当前几点在所有排队等锁的线程中的排序

  • 根据排序-1,获得排在自己前面的线程的节点名

给exists加上watcher,监控当前线程等待的节点waitLock是否还存在;

若存在即stat不为null,当前线程先开始await;

同时watch线程也启动了开始监控exists操作;

若是exists状态有变化了(即waitLock不存在了)触发watch线程的countDown操作;

countDown操作使当前线程结束waiting,获得锁,开始继续往后执行。

代码算是比较简单的,想看完整代码的同学,可以在公众号后台回复9获得 

推荐阅读

zookeeper-操作与应用场景-《每日五分钟搞定大数据》

zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》

zookeeper-一个关于paxos的故事-《每日五分钟搞定大数据》

QRvmueR.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK