分布式锁解决方案_Zookeeper实现分布式锁

2023-12-20 06:35:13

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
分布式锁解决方案_Zookeeper实现分布式锁


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

Zookeeper 是一个开源的分布式协调服务,它提供了一种简单而强大的方式来管理分布式系统中的数据和状态。通过利用 Zookeeper 的特性,我们可以构建一个高可靠性和高性能的分布式锁实现。
博客将详细介绍 Zookeeper 实现分布式锁的原理和步骤,包括创建锁节点、获取锁、释放锁。我们还将讨论 Zookeeper 的可靠性和容错性,以及如何处理节点的删除和会话超时。
通过阅读这篇博客,你将了解到如何使用 Zookeeper 来实现分布式锁,以及如何在实际的分布式系统中应用这些技术。无论是构建高性能的分布式应用还是解决并发问题,分布式锁都是一个重要的工具。希望这篇博客能为你提供有价值的信息,并帮助你在分布式系统中更好地管理共享资源。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Zookeeper实现分布式的优点?

  1. 简单易用:Zookeeper 提供了简单的 API 来创建和管理锁,使用起来相对容易。
  2. 可靠性高:Zookeeper 本身具有高可用性和容错性,能够确保锁的可靠性和一致性。
  3. 支持公平锁:Zookeeper 支持公平锁,即按照先来先服务的原则分配锁。
  4. 支持可重入锁:Zookeeper 可以通过节点的子节点数量来表示锁的持有次数,从而支持可重入锁。
  5. Zookeeper 可以设置锁的超时时间,避免死锁的情况发生。
  6. 超时机制:Zookeeper 可以设置锁的超时时间,避免死锁的情况发生。
  7. 支持跨进程和跨机器:Zookeeper 是一个分布式协调服务,可以用于跨进程和跨机器的锁管理。
  8. 顺序保证:Zookeeper 保证了节点创建的顺序性,可以利用这一点来实现顺序锁。

二、实现原理

获得锁

  1. 当第一个客户端请求过来时,Zookeeper 客户端会创建一个持久节点 locks。如果它(Client1)想获得锁,需要在 locks 节点下创建一个顺序节点 lock1。
  2. 接着,客户端 Client1 会查找 locks 下面的所有临时顺序子节点,判断自己的节点 lock1 是不是排序最小的那一个,如果是,则成功获得锁。
  3. 这时候如果又来一个客户端 client2 前来尝试获得锁,它会在 locks 下再创建一个临时节点 lock2。
  4. 客户端 client2 一样也会查找 locks 下面的所有临时顺序子节点,判断自己的节点 lock2 是不是最小的,此时,发现 lock1 才是最小的,于是获取锁失败。获取锁失败,它是不会甘心的,client2 向它排序靠前的节点 lock1 注册 Watcher 事件,用来监听 lock1 是否存在,也就是说 client2 抢锁失败进入等待状态。
  5. 此时,如果再来一个客户端Client3来尝试获取锁,它会在 locks 下再创建一个临时节点 lock3。
  6. 同样的,client3 一样也会查找 locks 下面的所有临时顺序子节点,判断自己的节点 lock3 是不是最小的,发现自己不是最小的,就获取锁失败。它也是不会甘心的,它会向在它前面的节点 lock2 注册 Watcher 事件,以监听 lock2 节点是否存在。

释放锁

  1. 如果是任务完成,Client1 会显式调用删除 lock1 的指令。
  2. 如果是客户端故障了,根据临时节点得特性,lock1 是会自动删除的。
  3. lock1 节点被删除后,Client2 可开心了,因为它一直监听着 lock1。lock1 节点删除,Client2 立刻收到通知,也会查找 locks 下面的所有临时顺序子节点,发下 lock2 是最小,就获得锁。
  4. 同理,Client2 获得锁之后,Client3 也对它虎视眈眈

三、实现步骤

1.引入Curator依赖

    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-framework</artifactId>
      <version>5.2.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-recipes</artifactId>
      <version>5.2.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-client</artifactId>
      <version>5.2.0</version>
    </dependency>

2.编写Zookeeper配置

@Configuration
public class ZookeeperConfig {
  @Bean
  public CuratorFramework zookeeperClient() {
    CuratorFramework client = CuratorFrameworkFactory.builder()
         .connectString("127.0.0.1:2181")//zookeeper地址
         .sessionTimeoutMs(5000)//会话超时时间
         .connectionTimeoutMs(5000)//连接超时时间
         .retryPolicy(new ExponentialBackoffRetry(1000, 3))//重试机制,1秒重连3次
        //.namespace("test")
         .build();
    client.start();
    return client;
   }
}

3.代码实现

  @Autowired
  CuratorFramework client;
  @Override
  public String createOrderZookeeper(Integer productId, Integer count) throws Exception {
    // client cruator中zk客户端对象  path 抢锁路径同一个锁path需要一致
    InterProcessMutex lock = new InterProcessMutex(client, "/lockPath");
    //第一个属性:定时的时间数字
    //第二个属性:定义时间的单位
    if (lock.acquire(3, TimeUnit.SECONDS)) {
      try {
        // 业务代码,不予展示,根据具体需求进行编写
       } finally {
        lock.release();
       }
     }
    return "创建失败";
   }




总结

提示:这里对文章进行总结:
总的来说,Zookeeper 是一种强大的工具,可以用于实现分布式锁。通过理解 Zookeeper 的原理和使用方法,我们可以构建高可靠性和高性能的分布式系统。如果你对分布式锁的实现感兴趣,这篇博客提供了一个很好的起点。

文章来源:https://blog.csdn.net/liubopro666/article/details/135049762
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。