`
bit1129
  • 浏览: 1072585 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[Zookeeper学习笔记之三]Zookeeper实例创建和会话建立的异步特性

 
阅读更多

为了说明问题,看个简单的代码,

 

    import org.apache.zookeeper.*;  
      
    import java.io.IOException;  
    import java.util.concurrent.CountDownLatch;  
    import java.util.concurrent.ThreadLocalRandom;  
      
    public class ZKApplication implements Watcher {  
        private static final int SESSION_TIMEOUT = 3000;  
        private volatile static boolean shutdown;  
        private ZooKeeper zk;  
        private CountDownLatch connectedSignal = new CountDownLatch(1);  
      
        public void connect(String hosts) throws IOException, InterruptedException { 
        try {
            System.out.println("Start to create the Zookeeper instance");
            zk = new ZooKeeper(hosts, SESSION_TIMEOUT, this);
            new Thread(new Runnable() {
                int count = 0;
                @Override
                public void run() {
                    while (count++ <= 1000) {
                        System.out.println(zk.getState());
                        try {

                            Thread.currentThread().sleep(20);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }

            }).start();
        } catch(IOException e) {
            e.printStackTrace();
            throw e;
        }
       connectedSignal.await(); //Wait for the SyncConnected event occurs and process has been called, which will stop the waiting here.    }
        }  
      
        @Override  
        public void process(WatchedEvent event) { // Watcher interface  
            if (event.getState() == Event.KeeperState.SyncConnected) {  
                connectedSignal.countDown();  //connectedSignal.await() will no longer wait
            }  
        }  
      
        public void create(String groupName) throws KeeperException,  
                InterruptedException {  
            String path = "/" + groupName;  
            String createdPath = zk.create(path, null/*data*/, ZooDefs.Ids.OPEN_ACL_UNSAFE,  
                    CreateMode.EPHEMERAL); //The znode will be deleted upon the session is closed.  
            System.out.println("Created " + createdPath);  
        }  
      
        public void close() throws InterruptedException {  
            zk.close();  
        }  
      
        public static void main(String[] args) throws Exception {  
            final ZKApplication createGroup = new ZKApplication();  
            String groupName = "zoo" + ThreadLocalRandom.current().nextInt();  
            createGroup.connect(Host.HOST);  
            createGroup.create(groupName);  
            createGroup.close();  
        }  
    }  

 

    上面的代码在Zookeeper没有启动的情况下,控制台输出1000次CONNECTING,也不退出,原因是已经发生了死锁问题。  引发死锁问题的是同步闭锁connectedSignal的使用,代码中的含义是客户端在connect方法中发起链接,然后connect一直等待直到 Watcher的process被回调将闭锁计数置零,通常这个没有问题,可是当Zookeeper压根没有启动的时候,这个代码会陷入死锁:

  1. 死锁发生在客户端阻塞等待于connectedSignal的await方法上,发生阻塞说明connectedSignal的计数没有置零,没有置零说明process没有调用,因为Zookeeper没有启动,所以说process没有被调用是合理的。代 码死锁于connectSignal的await方法上,那么意思是说,Zookeeper对象构造和会话建立过程应该是异步的,Zookeeper构造 方法返回后,另外一个会话创建线程会尝试建立会话,从代码的输出可以看出,会话状态一直是Connecting状态(试图创建会话,但尚未创建成功的状 态),Zookeeper的Javadoc清楚的说到Zookeeper实例和会话建立是异步的过程: Session establishment is asynchronous. This constructor will initiate connection to the server and return immediately - potentially (usually) before the session is fully established. The watcher argument specifies  the watcher that will be notified of any changes in state. This notification can come at any point before or after the constructor call has returned.
  2. 会 话建立的失败策略,比较直观的做法时当建立会话不成功时,第一时间通知客户,给客户以失败快速响应的机制。。。不过Zookeeper似乎采用另外一种策 略,连接不成功不告诉你,只有当调用Zookeeper的API时,才会真正的把连接未建立的异常抛给客户端,这么做的好处是在Zookeeper实例创 建但是由于连接不成功而处于Connecting状态时,如果在用户调用Zookeeper的API做具体的事情之前,Zookeeper恢复了,那么客 户端再调用Zookeeper的API进行操作时,跟Zookeeper一直处于健康的状态一样,这也体现了Zookeeper的高可用性。
  3. 会话的建立和会话的状态管理是在单独的线程中

 

了解了Zookeeper对象实例化和会话建立的异步性,一方面可以了解Zookeeper的设计策略,另一方面,也可以避免一些代码和同步策略导致的陷阱,比如代码中那样。

 

 

虽然代码中主线程已经阻塞于connect方法,可是当Zookeeper服务器启动后,Client会建立连接,然后回调Watcher的process方法,此时就会解锁,从这个角度上来说,这里的死锁应该不叫事,应该启动这个程序目的就是要有Zookeeper在运行才好,如果Zookeeper之后断了,connectionsignal这个闭锁已经不再起作用。

 

 

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    zookeeper学习笔记

    ### Zookeeper 学习笔记 #### 一、Zookeeper 简介与安装配置 **Zookeeper** 是一个分布式协调服务框架,它提供了一种高效可靠的机制来维护集群中的配置信息、命名服务以及提供分布式锁等功能,使得开发人员能够...

    Zookeeper学习笔记.pdf

    每个Znode有三个与Zxid相关的属性:cZxid(创建时间的Zxid)、mZxid(最后修改时间的Zxid)和pZxid(子节点变更时间的Zxid),这些属性帮助追踪和排序节点的历史操作。 总的来说,Zookeeper通过其独特的数据模型、...

    2021尚硅谷技术之Zookeeper笔记

    ZooKeeper集群通常由三个或五个节点组成,以确保高可用性和容错性。配置文件中需要指定集群中的所有节点地址,并通过选举算法确定领导者节点。每个节点都需要启动ZooKeeper服务,节点间通过 zab 协议进行通信和数据...

    Zookeeper学习笔记

    【Zookeeper学习笔记】 Zookeeper是一个分布式协调服务,它的核心目标是简化分布式环境下的数据管理与系统协调。作为Apache Hadoop和HBase的重要组件,Zookeeper提供了简单的原语集,支持分布式应用程序之间的通信...

    Zookeeper学习笔记.docx

    ZooKeeper 学习笔记 ZooKeeper 是一个开源的分布式协调服务,由 Hadoop 的创始人 Doug Cutting 等人开发。它为分布式应用提供了一个高效、可靠的协调机制,帮助开发者快速构建高可用、可扩展的分布式系统。 ...

    ZooKeeper学习笔记

    ### ZooKeeper的核心特性 #### 分布式协调服务 ZooKeeper通过提供一系列的服务来简化分布式系统的开发,这些服务包括但不限于: - **同步机制**:确保分布式系统中的进程能够以有序的方式运行。 - **配置维护**:...

    基于Java语言的Zookeeper学习笔记设计源码

    该项目为基于Java语言的Zookeeper学习笔记设计源码,总计包含20个文件,具体构成包括15个Java源文件、3个PNG图片文件以及1个Markdown文件。此外,项目还包含1个XML配置文件,适用于学习和实践Zookeeper相关知识。

    zookeeper学习笔记.pptx

    本文适合但不限于软件开发人员阅读。本文档能够使阅读者对zookeeper有一个宏观且全面的了解,内容主要包含zookeeper架构、数据模型、读写及工作原理、典型应用场景、指令汇总等,

    Zookeeper学习资源和笔记(附代码)

    例如,`ZooKeeper`类的`exists()`方法用于检查节点是否存在,`getData()`和`setData()`分别用于读取和更新节点数据,`create()`用于创建节点,`delete()`用于删除节点,`getChildren()`用于获取子节点列表,`exists...

    hadoop,hbase,zookeeper安装笔记

    hadoop,hbase,zookeeper安装笔记hadoop,hbase,zookeeper安装笔记hadoop,hbase,zookeeper安装笔记

    zookeeper笔记.pdf

    ZooKeeper笔记 ZooKeeper是一个分布式应用程序协调服务,提供了一个树形命名空间,用于存储和管理数据。 ZooKeeper主要用于分布式应用程序的配置管理、名称服务、分布式同步和提供组服务等。 ZooKeeper命令 * ...

    Dubbo+zookeeper 入门简单实例

    【标题】"Dubbo+zookeeper 入门简单实例"揭示了如何在Java环境中结合Dubbo和Zookeeper构建一个基础的服务治理框架。Dubbo是阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,而Zookeeper则是一个分布式协调服务...

    zookeeper笔记和搭建

    资源名称:zookeeper笔记和搭建 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    zookeeper笔记

    ### Zookeeper概述 Zookeeper是一种分布式协调服务框架,它的核心任务是为用户的分布式应用程序提供一系列的协调...无论是从其提供的服务还是从其内部的机制来看,Zookeeper都是值得深入学习和掌握的重要技术之一。

    zookeeper完整学习笔记

    Zookeeper 提供了丰富的Java API,允许开发者方便地创建、删除、更新和查询znode,以及监听znode的变化。动态感知功能使得客户端能够实时感知到服务器上下线,从而做出相应的调整,确保服务的连续性和稳定性。 ...

    ZooKeeper会话超时以及重连机制.pdf

    通过上述分析可以看出,ZooKeeper针对会话超时和重连机制的设计非常完善,能够有效保证分布式系统的稳定性和高可用性。无论是会话超时的检测与处理,还是客户端的重连流程,都是经过精心设计和优化的。这些机制使得...

    zookeeper学习之三(Curator客户端)

    当ZooKeeper服务器断开连接时,Curator会自动尝试重新建立连接,并处理会话过期事件。这极大地提高了应用的健壮性。 2. **阻塞策略**: 在等待ZNode数据或事件时,Curator提供了一种阻塞策略。例如,`...

    apache zookeeper使用方法实例详解

    Apache ZooKeeper 使用方法实例详解 ... ZooKeeper 的使用方法实例详解可以帮助开发人员更好地理解 ZooKeeper 的基本原理和应用场景,并且能够更好地应用 ZooKeeper 来实现分布式系统的各项功能。

    Zookeeper搭建和原理学习

    Zookeeper 搭建和原理学习 Zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现。它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理...

    zookeeper-3.4.6_zookeeper_

    4. **会话管理**:Zookeeper维护客户端的会话状态,如果客户端与服务器的连接断开,会话可以被恢复,保证服务的连续性。 5. **命名服务**:Zookeeper可以作为分布式环境中的全局命名服务,通过路径来标识和查找服务...

Global site tag (gtag.js) - Google Analytics