分布式锁是分布式系统中对同一个资源访问进行控制的方式。
排他锁(写锁):
当一个事物对某一个资源加上排他锁后,只有该事物能对这个资源进行读写操作,其余事物只能等待该事物释放这个锁后才能进行操作。
zookeeper实现方法:
1、所有客户端往一个节点A下创建临时子节点B。创建请求属于事物请求,所有的事物请求都将发送给leader,leader顺序执行写操作,所以能保证只有一个客户端能成功创建子节点B。
2、创建成功后持有锁。其余客户端创建失败后会对A节点注册子节点变更的watcher监听。
3、当获得锁的客户端释放锁后,节点B消失,触发watcher监听通知客户端。
4、其余客户端会再次尝试创建B,创建成功的获得锁,其余的继续注册watcher监听。
共享锁(读锁):
当一个事物对某一个资源加上共享锁后,该事物能对这个资源进行读操作,其余事物也只能对该事物加共享锁。直到共享锁全部释放。
zookeeper实现方法:
1、客户端在/A节点下创建[自身标识]+ [读写类型] 的临时顺序节点。
2、获取/A节点下的所有子节点。
3、
a.如果自己是读请求,并且自己序号是最小的或者比自己小的都是读请求,则获取到共享锁;如果比自己小的有写请求,则获取失败,进入等待同时向比自己小的最后一个写请求节点注册watcher。
b.如果自己是写请求,同时是最小的节点,则获取到共享锁;如果自己不是最小的则获取失败,进入等待同时向比自己小的最后一个节点注册watcher。
4、获取到锁的客户端执行完之后删除临时节点并释放锁,其余客户端接受到watcher通知后从步骤2开始循环。