`
丁树同
  • 浏览: 9679 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

3)用zookeeper实现分布式锁

 
阅读更多

    在我们的项目当中,可能有许多组件在并行的运行。这些组件可能需要更新我们的数据存储。所以这些组件应该有解决冲突的能力,避免脏数据。但是这些组件往往运行在不同的服务器上,甚至编程语言,文件系统结构都是不同的。这些差异给我们的分布式协作带来困难。

    zookeeper给我们提供了解决方案。那么如何借助zookeeper来管理我们的分布式系统,达到系统之间的协作呢?我们可以通过zookeeper来实现分布式锁的概念,从而达到系统之间的协作目的。

 

public class DistributedLock {

  private final ZooKeeper zk;
  private final String lockBasePath;
  private final String lockName;

  private String lockPath;

  public DistributedLock(ZooKeeper zk, String lockBasePath, String lockName) {
    this.zk = zk;
    this.lockBasePath = lockBasePath;
    this.lockName = lockName;
  }

  public void lock() throws IOException {
    try {
      // lockPath will be different than (lockBasePath + "/" + lockName) becuase of the sequence number ZooKeeper appends
      lockPath = zk.create(lockBasePath + "/" + lockName, null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);

      final Object lock = new Object();

      synchronized(lock) {
        while(true) {
          List<String> nodes = zk.getChildren(lockBasePath, new Watch() {
            @Override
            public void process(WatchedEvent event) {
              synchronized (lock) {
                lock.notifyAll();
              }
            }
          });
          Collections.sort(nodes); // ZooKeeper node names can be sorted lexographically
          if (lockPath.endsWith(nodes.get(0)) {
            return;
          } else {
            lock.wait();
          }
        }
      }
    } catch (KeeperException e) {
      throw new IOException (e);
    } catch (InterruptedException e) {
      throw new IOException (e);
    }
  }

  public void unlock() throws IOException {
  try {
	  zk.delete(lockPath, -1);
	  lockPath = null;
	} catch (KeeperException e) {
	  throw new IOException (e);
    } catch (InterruptedException e) {
      throw new IOException (e);
    }
  }
}

 

  1.  构造方法
    public DistributedLock(ZooKeeper zk, String lockBasePath, String lockName) {
        this.zk = zk;
        this.lockBasePath = lockBasePath;
        this.lockName = lockName;
      }
     需要给构造方法提供三个参数,zk 表示可以连接到zookeeper服务器的客户端。lockBasePath 准备将节点创建在那个目录路径下。lockName指创建的子目录名称。
  2. 创建节点
    lockPath = zk.create(lockBasePath + "/" + lockName, null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
     这里注意的地方就是节点的类型是ephemeral并且是sequetial的。也就是说我们可以在lockBasePath下面可以创建多个名为lockName的多个临时节点,这些节点时有序的。sequetial节点的名称可以相同,因为zookeeper将transactionID后缀到节点路径后面以用于区分。这也是实现分布式锁的关键。另外这些节点时临时的,保证当申请锁的程序失去session以后,可以由zookeeper自动去除该节点。
  3. 申请锁
    final Object lock = new Object();
    
          synchronized(lock) {
            while(true) {
              List<String> nodes = zk.getChildren(lockBasePath, new Watch() {
                @Override
                public void process(WatchedEvent event) {
                  synchronized (lock) {
                    lock.notifyAll();
                  }
                }
              });
              Collections.sort(nodes); // ZooKeeper node names can be sorted lexographically
              if (lockPath.endsWith(nodes.get(0)) {
                return;
              } else {
                lock.wait();
              }
            }
          }
     因为watcher 里面的process()是有外部线程触发的,所以为了保证两次时间上相近的触发操作能够同步执行使用两层的synchronized block。
  • 首先从zookeeper lockBasePath目录下面获得所有的名字为lockName的节点。
  • 将子节点排序
  • 如果该线程创建的节点时最小的节点也就是相对其他节点时最先创建的,那么就获得了锁,跳出while循环执行相应的操作逻辑。否则释放锁,等待节点变化事件触发下一次循环重新申请锁。
  • 当执行完操作逻辑以后,就可以释放锁了,也就是删除该线程创建的节点。
分享到:
评论

相关推荐

    使用ZooKeeper实现分布式锁

    同时,`distribute-lock`这个文件可能包含了具体的实现代码或示例,通过学习和理解这个文件,我们可以更深入地掌握如何在实践中运用ZooKeeper实现分布式锁。 总之,ZooKeeper的分布式锁机制为解决分布式环境下的...

    基于zookeeper的分布式锁简单实现

    - **测试代码**:展示了如何在实际应用中使用Zookeeper实现分布式锁的示例,包括创建锁、获取锁、释放锁以及异常处理等操作。 - **实用工具类**:封装了与Zookeeper交互的常用方法,如创建节点、设置监听、检查节点...

    基于zookeeper的分布式锁实现demo

    本部分将详细介绍使用Zookeeper实现分布式锁的知识点。 Zookeeper是Apache的一个开源项目,它为分布式应用提供了高可用性、顺序保证以及集群间同步等特性,它能够很好地帮助实现分布式锁。 **Zookeeper分布式锁的...

    基于zookeeper实现分布式锁

    zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是集群的管理者。提供了文件系统和通知机制。...在开发项目的过程中,很多大型项目都是分布式部署的,那么我们现在使用zookeeper实现一个分布式锁。

    使用zookeeper实现分布式共享锁

    本篇文章将深入探讨如何使用Zookeeper实现分布式共享锁。 分布式锁是一种在多节点之间共享资源的机制,它允许在同一时间只有一个节点对资源进行操作。在Java环境中,我们可以利用Zookeeper的API来创建和管理这种锁...

    通过zookeeper实现分布式锁

    【Zookeeper实现分布式锁】 Zookeeper 是 Apache Hadoop 项目下的一个子项目,是一个高性能的分布式协调服务。它提供了一种可靠的方式来管理分布式系统中的配置信息、命名服务、集群管理和同步服务。Zookeeper 的...

    zookeeper做分布式锁

    在实际项目中,可以使用Java的ZooKeeper客户端库(如Curator)来简化分布式锁的实现。这些库提供了高级API,帮助开发者更方便地处理ZooKeeper的操作,例如创建、删除节点,以及设置节点监视器等。 总之,ZooKeeper...

    zookeeper实现分布式锁

    在程序开发过程中不得不考虑的就是并发问题。在java中对于同一个jvm而言,jdk已经提供了lock和同步等。但是在分布式情况下,往往存在多个进程对一些资源产生竞争...分布式锁顾明思议就是可以满足分布式情况下的并发锁。

    redis和zookeeper实现分布式锁的区别

    3. **操作难度**:Redis实现分布式锁较为复杂,需要处理时间计算、锁续期等问题;而Zookeeper通过创建和监听临时节点,实现逻辑更为清晰简单。 总结来说,Redis和Zookeeper在实现分布式锁时各有优缺点。Redis适合对...

    (源码)基于ZooKeeper的分布式锁实现.zip

    1. 分布式锁实现利用ZooKeeper的顺序临时节点特性,实现分布式锁的创建和管理。 2. 锁监听器提供LockListener接口,允许在锁被获取或释放时执行自定义操作。 3. 重试机制通过ProtocolSupport类实现操作重试机制,...

    Zookeeper实现分布式锁

    在这个场景下,我们将详细探讨如何利用Zookeeper来实现分布式锁。 分布式锁的核心目标是在多个节点间实现互斥访问某个资源,确保同一时刻只有一个客户端能够持有锁。Zookeeper通过其提供的原子操作,如创建、删除...

    吊打面试官之基于zookeeper实现分布式锁源码

    本主题将深入探讨如何利用ZooKeeper实现分布式锁,并结合SpringCloud生态进行应用。ZooKeeper是一个分布式协调服务,而分布式锁是它的一个重要应用场景。 **ZooKeeper的特性与角色** 1. **强一致性**:ZooKeeper...

    基于Zookeeper实现分布式锁实践教程

    本实践教程将指导你如何利用Zookeeper实现分布式锁,以便在分布式环境中保证资源访问的互斥性。 **1. Zookeeper概述** Zookeeper是一个分布式协调服务,它为分布式应用提供了简单而强大的命名服务、配置管理、集群...

    使用Redis和Zookeeper实现分布式锁 基于redis和zookeeper工具集-包括循环锁实现、循环速率限制器、循环序列等.zip

    使用Redis和Zookeeper实现分布式锁。基于redis和zookeeper工具集-包括循环锁实现、循环速率限制器、循环序列等分布式套件基于redis和zookeeper的全局工具集-包括全局锁实现、全局速率限制器、全局ID生成器等。使用...

    zookeeper分布式锁实现和客户端简单实现

    **Zookeeper客户端实现分布式锁** 1. **连接Zookeeper**: 客户端首先需要与Zookeeper服务器建立连接,获取会话。 2. **创建临时顺序节点**: 在指定的路径(例如 `/lock`)下,客户端创建一个临时顺序节点。 3. **...

    浅谈Java(SpringBoot)基于zookeeper的分布式锁实现

    zookeeper是一种分布式协调服务,可以用于实现分布式锁。zookeeper提供了一个树形结构的命名空间,客户端可以在这个命名空间中创建、删除、修改节点。在分布式锁的实现中,zookeeper可以作为一个中间件,用于协调多...

    zookeeper分布式锁实例源码

    在这个场景下,我们将关注ZooKeeper如何实现分布式锁,特别是不可重入锁、可重入锁以及可重入读写锁的概念与实践。 首先,我们要理解什么是分布式锁。在多节点并发访问共享资源时,分布式锁能确保同一时刻只有一个...

    C#基于zookeeper分布式锁的实现源码

    以下是使用ZooKeeper实现分布式锁的一般步骤: 1. **创建锁节点**:每个客户端在尝试获取锁时,都会在ZooKeeper上的特定路径下创建一个临时顺序节点。这些节点按创建顺序编号,表示请求锁的顺序。 2. **检查锁状态...

    《Paxos到Zookeeper——分布式一致性原理与实践》高清完整版

    它的设计目标是简化分布式系统的开发,提供了一套简单易用的API,使得开发者可以轻松实现分布式锁、队列、事件监听等功能。 在《Paxos到Zookeeper》这本书中,作者会详细解析Paxos算法的原理,解释其背后的逻辑和...

Global site tag (gtag.js) - Google Analytics