`

分布式锁 zookeeper

 
阅读更多

package zk.lock;

 

import java.util.Collections;

import java.util.List;

import java.util.concurrent.CountDownLatch;

 

import org.apache.zookeeper.CreateMode;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.Watcher.Event.EventType;

import org.apache.zookeeper.Watcher.Event.KeeperState;

import org.apache.zookeeper.ZooDefs.Ids;

import org.apache.zookeeper.ZooKeeper;

import org.apache.zookeeper.data.Stat;

 

public class ZkDistributedClient {

    // 超时时间

    private static final int SESSION_TIMEOUT = 5000;

    // zookeeper server列表

    private String hosts = "127.0.0.1:2181";

    private String groupNode = "locks1";

    //private String subNode = "sub";

 

    private ZooKeeper zk;

    // 当前client创建的子节点

    private String thisPath;

    // 当前client等待的子节点

    private String waitPath;

 

    private CountDownLatch latch = new CountDownLatch(1);

//返回结果

    public String result =null;

    /**

     * 连接zookeeper

     * subNode 临时节点头

     * data 数据

     */

    public String  connectZookeeper(String subNode,String data) throws Exception {

    final String fdata = data;

   

   

        zk = new ZooKeeper(hosts, SESSION_TIMEOUT, new Watcher() {

            public void process(WatchedEvent event) {

                try {

                    // 连接建立时, 打开latch, 唤醒wait在该latch上的线程

                    if (event.getState() == KeeperState.SyncConnected) {

 

                    latch.countDown();

                    }

 

                 // 发生了waitPath的删除事件

                    if (event.getType() == EventType.NodeDeleted && event.getPath().equals(waitPath)) {

                    // 确认thisPath是否真的是列表中的最小节点

                    List<String> childrenNodes = zk.getChildren("/" + groupNode, false);

                    String thisNode = thisPath.substring(("/" + groupNode + "/").length());

                    // 排序

                    Collections.sort(childrenNodes);

                    int index = childrenNodes.indexOf(thisNode);

                    if (index == 0) {

                    // 确实是最小节点

                    String t = doSomething(fdata);

                    System.out.println("watch:::"+t);

                    result = t;

                    } else {

                    // 说明waitPath是由于出现异常而挂掉的

                    // 更新waitPath

                    waitPath = "/" + groupNode + "/" + childrenNodes.get(index - 1);

                    // 重新注册监听, 并判断此时waitPath是否已删除

                    if (zk.exists(waitPath, true) == null) {

                    String tt = doSomething(fdata);

                   

                    System.out.println("watch===watch:::"+tt);

                    result = tt;

                    }

                    }

                    }

                    

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }

        });

 

        // 等待连接建立

        latch.await();

 

        // 创建子节点

        thisPath = zk.create("/" + groupNode + "/" + subNode, null, Ids.OPEN_ACL_UNSAFE,

                CreateMode.EPHEMERAL_SEQUENTIAL);

 

        // wait一小会, 让结果更清晰一些

        Thread.sleep(10);

 

        // 注意, 没有必要监听"/locks"的子节点的变化情况

        List<String> childrenNodes = zk.getChildren("/" + groupNode, false);

        

 

        // 列表中只有一个子节点, 那肯定就是thisPath, 说明client获得锁

        if (childrenNodes.size() == 1) {

           return  doSomething(data);

        } else {

            String thisNode = thisPath.substring(("/" + groupNode + "/").length());

            System.out.println(thisNode +"--------------");

            // 排序

            Collections.sort(childrenNodes);

            int index = childrenNodes.indexOf(thisNode);

            if (index == -1) {

                // never happened

            } else if (index == 0) {

                // inddx == 0, 说明thisNode在列表中最小, 当前client获得锁

              return  doSomething(data);

            } else {

                // 获得排名比thisPath前1位的节点

                this.waitPath = "/" + groupNode + "/" + childrenNodes.get(index - 1);

                // 在waitPath上注册监听器, 当waitPath被删除时, zookeeper会回调监听器的process方法

                zk.getData(waitPath, true, new Stat());

                

                return null;

            }

        }

        

        return null;

    }

 

    private String doSomething(String data) throws Exception {

        try {

            System.out.println("gain lock: " + thisPath+"----"+data);

            byte[] by= zk.getData("/locknum", null, null);

            String num = new String(by);

            System.out.println(num+"   :::::当前值--------------------------");

            Integer newNum = Integer.parseInt(num) -1;

            zk.setData("/locknum", newNum.toString().getBytes(), -1);

            System.out.println(newNum+"   :::::最终值--------------------------");

 

            

            Thread.sleep(2000);

            // do something

        } finally {

            System.out.println("finished: " + thisPath);

            // 将thisPath删除, 监听thisPath的client将获得通知

            // 相当于释放锁

            zk.delete(this.thisPath, -1);

         

        }

        

        return data;

    }

    

    

 

    

    public static void main(String[] args) throws Exception {

        for (int i = 0; i < 5; i++) {

            new Thread() {

                public void run() {

                    try {

                        ZkDistributedClient dl = new ZkDistributedClient();

                       String s = dl.connectZookeeper("gao","test");

                        System.out.println("return-=========="+s);

                        System.out.println("return========================"+dl.result);

                    } catch (Exception e) {

                        e.printStackTrace();

                    }

                }

            }.start();

        }

 

        Thread.sleep(Long.MAX_VALUE);

    

        

    }

}

 

分享到:
评论

相关推荐

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

    这时,Zookeeper,一个高可用的分布式协调服务,常被用来实现分布式锁。 Zookeeper由Apache基金会开发,它提供了一种可靠的分布式一致性服务,包括命名服务、配置管理、集群同步、领导者选举等功能。Zookeeper基于...

    使用ZooKeeper实现分布式锁

    这里,我们将深入探讨如何利用ZooKeeper这一强大的分布式协调服务来实现分布式锁,以解决订单编号的唯一性问题。 ZooKeeper是由Apache Hadoop项目孵化的开源项目,它提供了一个高可用、高性能的分布式协调服务。其...

    zookeeper做分布式锁

    分布式锁是解决多节点系统中同步问题的一种常见技术,ZooKeeper,由Apache基金会开发的分布式协调服务,常被用于实现高效可靠的分布式锁。本文将深入探讨如何利用ZooKeeper来构建分布式锁,并讨论其背后的关键概念和...

    基于zookeeper的分布式锁实现demo

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

    zookeeper分布式锁

    Zookeeper,一个由Apache开发的分布式协调服务,提供了实现分布式锁的有效机制。 Zookeeper分布式锁的工作原理: 1. **会话和临时节点**:Zookeeper支持两种类型的节点,持久节点和临时节点。临时节点在客户端会话...

    zk分布式锁1

    除了ZooKeeper分布式锁外,还有其他分布式锁实现方案,如Redis分布式锁、MySQL分布式锁等。这些分布式锁实现方案都有其优缺点,需要根据不同的分布式系统需求进行选择。 ZooKeeper分布式锁是一种高效、灵活的分布式...

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

    Redis和Zookeeper是两种常用的分布式协调服务,它们都可以用来实现分布式锁,但具体实现方式和特性有所不同。 **Redis分布式锁** Redis作为内存数据库,具有高性能、低延迟的特点,常被用作实现分布式锁。Redis...

    java分布式锁实现代码

    接下来,我们转向使用Zookeeper实现的分布式锁。Zookeeper是一个分布式服务协调框架,它提供了一种可靠的分布式协调机制。Apache Curator是Zookeeper的一个客户端库,简化了与Zookeeper的交互。以下是使用Curator...

    基于zookeeper实现分布式锁

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

    分布式之Zookeeper(高清视频教程).rar

    Zookeeper是由Apache软件基金会开发的开源项目,旨在提供一种高效、可靠的分布式协调机制,广泛应用于配置管理、命名服务、集群管理、分布式锁、事件发布/订阅等场景。 **一、Zookeeper基本概念** 1. **节点...

    分布式锁原理讲解视频资料

    3. 基于Zookeeper的分布式锁:利用Zookeeper的临时有序节点和watcher特性,实现公平锁和非公平锁。这种实现方式稳定且可扩展,但需要对Zookeeper有一定的了解。 4. 基于分布式服务框架的分布式锁:如Dubbo、Spring ...

    ZookeeperNet实现分布式锁

    通过深入理解Zookeeper的工作原理以及ZookeeperNet库的使用,开发者可以有效地在C#环境中实现高可用的分布式锁,保障多节点之间的协同工作和数据一致性。在实际项目中,分布式锁可以广泛应用于数据库操作、并发任务...

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

    Zookeeper提供了一种类似于文件系统的数据模型,可以用于命名服务、配置管理、集群管理、分布式锁等场景。它具有强一致性、高可用性和高性能的特点,是实现分布式锁的理想选择。 **Zookeeper的分布式锁实现原理** ...

    42_分布式锁是啥?对比下redis和zk两种分布式锁的优劣?.zip

    **Redis与Zookeeper分布式锁对比** 1. **Redis分布式锁** - **优点:** - 实现简单,基于`SETNX`或`SET`命令加上超时机制可以快速构建分布式锁。 - 性能高,因为Redis是内存数据库,读写速度非常快。 - 支持...

    zookeeper实现分布式锁

    Zookeeper 实现分布式锁 Zookeeper 是一个分布式协调服务,可以为分布式应用提供高效、可靠、可扩展的分布式锁服务。Zookeeper 实现分布式锁是指使用 Zookeeper 来管理分布式环境中的共享资源,实现互斥访问,以...

    zk使用curator实现分布式锁

    ZooKeeper是一个高度可靠的分布式协调服务,它提供了诸如分布式锁、队列和配置管理等核心功能。Curator则是Apache ZooKeeper的一个客户端库,它简化了ZooKeeper的使用,提供了丰富的工具和策略,使得开发人员能够更...

    zookeeper分布式锁实例源码

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

    zk:redis分布式锁.zip

    本压缩包“zk:redis分布式锁.zip”提供了基于Zookeeper(zk)和Redis两种分布式锁实现的示例和相关资料。 首先,我们来看Zookeeper(zk)的分布式锁。Zookeeper是Apache的一个开源项目,提供了一个高可用的、高性能...

    springboot redis zookeeperlock rabbit实现的分布式锁

    本项目基于SpringBoot框架,结合Redis、Zookeeper和RabbitMQ实现了分布式锁,让我们一起深入探讨这三个组件在分布式锁中的作用和实现机制。 **SpringBoot** 是一个轻量级的Java开发框架,它简化了新Spring应用的...

Global site tag (gtag.js) - Google Analytics