ZooKeeper应用---分布式锁

实现要点

redis分布式锁的问题

redis通常也用来实现分布式锁,但是有一些问题

  • 进程需要主动请求redis判断锁是否被释放,会造成服务端的压力以及客户端循环的开销
  • 获得锁的进程需要设置过期时间来容错,有产生延迟的风险
  • redis主从切换有可能导致锁失效

zookeeper的优势

使用zookeeper实现分布式锁的优势

  • 临时节点,如果客户端失活节点被删除,可以通过设置session过期时间来控制删除时间
  • 有序节点,严格的单调递增顺序,可以控制并发时的顺序,类似排队
  • watch机制,客户端可以监听某个节点的任何事件
  • zookeeper集群是几乎高可用的,快速的选主,官方号称200ms内
  • zookeeper能够做到对外的统一视图,可线性化,leader节点失效会停止服务

实现思路

客户端创建临时有序节点 /testLock/lock ,然后拿到父目录 /testLock 下的所有节点并排序,判断自己是否是第一个节点,如果是获取锁成功,如果不是,就监听它的前一个节点的删除事件,当监听节点被删除时,获取锁成功。

代码实现

zookeeper集群的搭建和项目搭建细节请参考上一篇文章

ZooKeeper应用---分布式配置更新_Deepdoo的博客-CSDN博客zookeeper API的使用,基于回调和监听的响应式编程https://blog.csdn.net/weixin_44489428/article/details/123637468

ZkUtils文件 

package org.example.lock;

import org.apache.zookeeper.ZooKeeper;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;


public class ZkUtils {
    public static String root = "/testLock";
    public static String path = "/lock";
    private static ZooKeeper zk;
    private static final String address = "zk01:2181,zk02:2181,zk03:2181,zk04:2181" + root;
    private static final CountDownLatch latch = new CountDownLatch(1);

    public static ZooKeeper getZk() {
        try {
            zk = new ZooKeeper(address, 3000, new DefaultWatcher(latch));
            latch.await();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return zk;
    }
}

ZkUtils 作为一个工具类,主要是通过阻塞的方式获取 zookeeper 连接的实例。

address是zookeeper集群的连接地址,指定了本实验的根目录 /testLock,锁节点名称前缀 /lock。

DefaultWatcher是默认的监听类,当连接成功时把 CountDownLatch 减1,返回zk对象。

DefaultWatcher类

package org.example.lock;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;

import java.util.concurrent.CountDownLatch;


public class DefaultWatcher implements Watcher {
    private CountDownLatch latch;
    public DefaultWatcher(CountDownLatch latch) {
        this.latch = latch;
    }
    @Override
    public void process(W
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zookeeper是一个分布式应用程序协调服务,它提供了一个分布式锁、分布式队列等基本的分布式协作功能。而Paxos算法则是分布式系统中的一种经典算法,主要用于保证分布式系统的一致性。Zookeeper基于Paxos算法实现了分布式锁和分布式队列等功能。 Paxos算法主要解决的问题是分布式系统中的一致性问题。在分布式系统中,由于网络通信的延迟、节点宕机等原因,可能会导致数据的不一致性。Paxos算法通过选举一个Leader节点来协调各个节点的操作,从而保证系统的一致性。 Paxos算法主要分为三个阶段:提议、批准和执行。在提议阶段,一个节点向其他节点提议一个值;在批准阶段,如果超过半数节点同意了这个值,那么这个值就被批准了;在执行阶段,Leader节点将这个值发送给所有节点,让它们执行。 Zookeeper在实现分布式锁和分布式队列等功能时,也是基于这个流程实现的。当一个进程需要获取锁时,它会向Zookeeper服务发送一个请求,Zookeeper会选举一个Leader节点来处理这个请求。当一个进程需要使用队列时,它会向Zookeeper服务发送一个请求,Zookeeper会将这个请求放入队列中,并选举一个Leader节点来执行这个请求。 总之,Zookeeper是一个分布式应用程序协调服务,它提供了一些基本的分布式协作功能。而Paxos算法则是保证分布式系统一致性的经典算法,Zookeeper基于Paxos算法实现了分布式锁和分布式队列等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值