首页 > 编程知识 正文

zk怎么实现分布式锁,如何实现分布式锁

时间:2023-05-05 12:48:22 阅读:147331 作者:3139

如何在Zookeeper上实现分布式锁定?

在学习分布式锁定之前,首先需要了解Zookeeper的“临时序列节点”。

什么是临时顺序节点?

让我们回顾一下Zookeeper节点的概念。

Zookeeper的数据存储结构就像由一个称为Znode的节点组成的树。

Znode有四种类型。

1.持久节点 (PERSISTENT)

的默认节点类型。 创建节点的客户端与zookeeper断开连接后,该节点仍然存在。

3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com /

序列节点是创建节点时,根据Zookeeper创建的时间序列对其节点名称进行编号。

2.持久节点顺

与永久节点相反,如果创建节点的客户端与zookeeper断开连接,则临时节点将被删除。

序节点

qxdkj,临时顺序节点的结合和临时节点与顺序节点的特点:创建节点时,Zookeeper根据创建的时间序列对其节点名称进行编号; 如果创建节点的客户端与Zookeeper断开连接,则临时节点将被删除。

那个临时顺序节点和Zookeeper的分布式锁有什么关系呢?

(PERSISTENT_SEQUENTIAL)

Zookeeper分布式锁是应用了临时序列节点的锁。 具体怎么实现? 让我们看看详细的步骤。

3.临时节点(EPHEMERAL)

首先,在Zookeeper上创建永久节点ParentLock。 第一个客户端必须在名为ParentLock的节点下创建4.临时顺序节点(EPHEMERAL_SEQUENTIAL)Lock1才能获取锁定。

之后,客户端1查找并重新排序ParentLock下的所有临时顺序的节点,判断自己创建的节点Lock1是否是顺序最快的。 对于第一个节点,已成功获取锁定。

此时,如果另一个客户端Client2来获取锁定,请在ParentLock下载中创建临时序列节点Lock2。

客户端2查找并排序ParentLock下的所有临时顺序节点,并确定自己创建的节点Lock2是否是顺序最快的节点,结果表明节点Lock2不是最小的。

因此,客户端2在排序靠前的节点Lock1中注册Zookeeper分布式锁的原理,监听Lock1节点的存在。 这意味着客户端2未能夺取锁定,进入等待状态。

此时,如果另一个客户端Client3来获取锁定,请在ParentLock上下载它,然后创建临时序列节点Lock3。

客户端3查找并排序ParentLock下的所有临时顺序节点,并确定自己创建的节点Lock3是否是顺序最早的节点,结果同样表明节点Lock3不是最小的。

因此,客户端3对更高节点获取锁注册Watcher进行排序,以监听是否存在Lock2节点。 这意味着Client3也同样未能夺取锁定,进入等待状态。

这样,客户端1被锁定,客户端2监听到Lock1,客户端3监听到Lock2。 这正好形成了一个队列,类似于Java中ReentrantLock依赖的http://www.Sina.com/(abstractqueuedsynchronizer )。

获得锁定的过程大致是这样的,Zookeeper如何解锁?

解锁过程很简单,释放相应的子节点即可。

临时顺序节点

要解除锁定,有以下两种情况:

Watcher

任务完成后,客户端1将显示命令以调用删除节点Lock1。

Lock2

获取锁定的客户端1在执行任务时,如果Duang突然崩溃,则会断开与Zookeeper服务器端的链接。 根据临时节点的特性,会自动删除关联的节点Lock1。

由于客户端2一直监听Lock1的存在状态,因此当Lock1节点被删除时,客户端2将立即收到通知。 然后,客户端2再次检查ParentLock下的所有节点,以确定您创建的节点Lock2是否是当前最小的节点。 最小时,客户端2已成功锁定。

同样,如果客户端2也因为任务完成或节点崩溃而删除节点Lock2,客户端3将收到通知。

最终,客户端3成功锁定。

使用Zookeeper实现分布式锁定的大致流程是这样的。 那么,使用Zookeeper实现的分布式锁与Redis实现的分布式锁相比有什么好处和缺点呢?

让我们总结一下他们各自的优劣。

分布式锁定的优点缺点Zookeeper 1.有封装的框架,容易实现

2 .有排队等待锁定,抢锁效率大幅提高。

添加和删除节点性能低RedisSet和Del指令性能高1 .实现复杂,需要考虑超时、原子、误删除等。

2 .没有等待锁定的队列,只能在客户端旋转等待,效率很低。

据说Zookeeper实现的分布式锁是可重新输入的,而Redis实现的分布式锁是不可重新输入的。 这是AQS两者都可以在客户端实现可重新输入的逻辑。

在此介绍Zookeeper分布式锁定的内容。

参考:程序员负责的发箍— 《如何用Zookeeper实现分布式锁》

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。