持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
Zookeeper实现分布式锁
在实际项目开发中,往往系统并发量访问量大了以后,在对于临界资源的控制,就需要加锁的方式来解决,一般在单体项目中往往使用LOCK接口和suchornized关键字来保证线程安全,而分布式系统中就需要引入分布式锁来保证;
加锁的原理其实很简单,讲白了就是序列化请求访问线程,同一时间只能有一个线程拥有资源的所有权,操作权;
实现分布式锁就要使用脱离于本身应用系统之上的一个公共中间件系统例如redis。zookeeper等;
zookeeper分布式锁的原理:
我们知道zzookeeper的节点 文件管理系统拥有临时顺序节点的特性;很显然这种文件的生成方式很适合分布式锁的实践;
1、zookeeper的顺序行生成节点,天然相当于一个排队队列,还是顺序性的那种,他会为每个加入资源抢夺的线程都按照先后顺序排队,上一个节点的序号刚好比下一个大1, 因此zookeeper按照这种方式为每个线程办法排队号;
2、同时依靠这种顺序行的节点,可以保证公平性,为公平锁的实现提供了理论 基础;
所谓可以保证公平性就是指每个线程都会在指定的节点下创建顺序性临时节点,编号依次递增,因此编号越小的越早的获得线程的优先执行权,因此在队列里面是否可以获取锁的条件就是你判断自己当前节点是不是最小的是不是前面没有节点了;
3、当然,实现这一切的关键步骤就是节点的watch机制,
加入的线程抢占锁之前,先会创建一个Node节点。释放锁的时候,删除它, 成功创建节点后,如果不是排号最小的节点,那么自己就处于等待状态。
这种方式的实现只需要再其前面一个节点监听就可以。前一个节点删除的时候,会触发watcher事件,当前节点能监听到删除事件,代表前面的节点释放了资源,自己就可以去获取资源了。按照这种方式依次向后。 因此利用ZooKeeper的监听机制,就可以实现队列式的通知。
大概的流程:
-
等待接收通知的Znode节点,监听自己前面那个节点的数据状态的变化
-
只是监听比自己当前节点序号大一号的节点
-
一旦监听到上一个节点被删除,然后判断自己是不是最小的那个
-
是的话,自己就获得锁,访问临界资源