`
xt00002003
  • 浏览: 21115 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Zookeeper-会话创建流程

阅读更多

通过学习Zookeeper来对自己的java知识进一步细化。这里先从整体把Zookeeper会话的创建过程总结出来。这些信息都是出自《从Paxos到Zookeeper》这本书。然后接下来一步一步通过源码分析是如何做的。

一次会话的创建过程

初始化阶段

  1. 初始化Zookeeper对象。调用Zookeeper的构造方法来实例化一个Zookeeper,在初始化过程中,会创建一个客户端的Watcher管理器:ClientWatchManager。
  2. 设置会话默认Watcher。如果在构造方法中传入一个Watcher对象,那么客户端会将这个对象作为默认Watcher保存在ClientWatchManager。
  3. 构造Zookeeper服务器地址列表管理器:HostProvider。在构造方法中传入的服务器地址,客户端会将其存放在服务器地址列表管理器HostProvider中。
  4. 创建并初始化客户端网络连接器:ClientCnxn。Zookeeper客户端首先会创建一个网络连接器ClientCnxn。用来管理客户端与服务器的网络交互。另外,客户端在创建ClientCnxn的同时,还会初始化客户端两个核心队列outgoingQueue和pendingQueue,分别作为客户端的请求发送队列和服务器端响应的等待队列。
  5. 初始化SendThread和EventThread。客户端会创建两个核心网络线程SendThread和EventThread,前者用于管理客户端和服务端之间的所有网络I/O,后者则用于进行客户端的事件处理。同时,客户端还会将ClientCnxnSocket分配给SendThread作为底层网络I/O处理器,并初始化EventThread的待处理事件队列waitingEvents,用于存放所有等待被客户端处理的事情。

 

会话创建阶段

  1. 启动SendThread和EventThread。SendThread首先会判断当前客户端的状态,进行一系列请理性工作,为客户端发送“会话创建”请求做准备。
  2. 获取一个服务器地址。在开始创建TCP之前,SendThread首先需要获取一个Zookeeper服务器的目标地址, 这通常是从HostProvider中随机获取出一个地址,然后委托给ClientCnxnSocket去创建与Zookeeper服务器之间的TCP连接。
  3. 创建TCP连接。获取一个服务器地址后,ClientCnxnSocket负责和服务器创建一个TCP长连接。
  4. 构造ConnectRequest请求。
  5. 在TCP连接创建完毕后,可能有的读者会认为,这样是否就说明已经和Zookeeper服务器完成连接了呢?其实不然,上面的步骤只是纯粹地从网络TCP层完成了客户端与服务端之间的Socket连接,但远未完成Zookeeper客户端的会话创建。
  6. SendThread会负责根据当前客户端的实际设置,构造出一个ConnectRequest请求,该请求代表了客户端试图与服务端创建一个会话。同时,Zookeeper客户端还会进一步将该请求包装成网络I/O层的Packet对象,放入发送队列outgoingQueue中去。
  7. 发送请求。当客户端请求准备完毕后,就可以开始向服务端发送请求了。ClientCnxnSocket负责从outgoingQueue中取出一个待发送的Packet对象,将其序列化成ByteBuffer后,向服务端进行发送。

响应处理阶段

  1. 接受服务器端响应。ClientCnxnSocket接受到服务端响应后,会首先判断当前的客户端状态是否是“已初始化”,如果尚未完成初始化,那么就认为该响应一定是会话创建请求的响应,直接交由readConnectResult方法来处理该响应。
  2. 处理Response。ClientCnxnSocket会对接受到的服务端响应进行反序列化,得到ConnectResponse对象,并从中获取到Zookeeper服务端分配的会话SessionId。
  3. 连接成功。连接成功后,一方面需要通知SendThread线程,进一步对客户端进行会话参数的设置,包括readTimeout和connectTimeout等,并更新客户端状态,另一方面,需要通知地址管理器HostProvider当前成功连接的服务器地址。
  4. 生成时间:SyncConnected-None。为了能够让上层应用感知到会话的成功创建,SendThread会生成一个事件SyncConnected-None,代表客户端与服务器会话创建成功,并将该事件传递给EventThread线程。
  5. 查询Watcher。EventThread线程收到事件后,会从ClientWatchManager管理器中查询出对应的Watcher,针对SyncConnected-None事件,那么就直接找出存储的默认Watcher,然后将其放到EventThread的watingEvents队列中去。
  6. 处理事件。EventThread不断的从watingEvents队列中取出待处理的Watcher对象,然后直接调用该对象的process接口方法,以达到触发Watcher的目的。

下一篇文章将会通过源码的阅读理解初始化阶段。

 

0
5
分享到:
评论

相关推荐

    apache-zookeeper-3.5.8-bin.zip

    5. **命令行接口(CLI)**:通过 `zkCli.sh` 工具与 ZooKeeper 交互,可以创建、删除、更新 ZNode,以及查询和监控 ZooKeeper 状态。 6. **集群配置**:ZooKeeper 集群由多个服务器组成,每个服务器都有一个唯一的 ...

    zookeeper-manage-center-master.zip

    `zookeeper-manage-center-master`提供了对这些数据节点的管理功能,包括创建、删除、更新ZNode以及查看其属性(如ACL权限、版本号等)。这使得运维人员无需直接操作命令行,就能完成对Zookeeper数据的管理,提高了...

    zookeeper-3.4.5.rar

    对于Zookeeper 3.4.5的绿色版,它的特点是无需编译安装,解压后即可直接运行,大大简化了部署流程。以下是针对不同系统的使用方法: 在**Linux**系统上: 1. 将`zookeeper-3.4.5`解压至任意目录,如`/usr/local/...

    zookeeper-3.4.8源码包

    每个API背后都对应着Zookeeper内部的一系列处理流程,例如,创建ZNode需要进行权限检查、事务序列化、提交到ZAB协议等步骤。 六、Zookeeper集群配置与管理 Zookeeper集群通过配置文件(zoo.cfg)设定,包括服务器...

    zookeeper-3.4.5

    客户端与Zookeeper服务器建立会话,会话期间,客户端可以设置Watcher来监听特定节点的变化。一旦节点发生变化,Zookeeper会立即通知所有相关的Watcher,这种异步事件驱动机制极大地提高了系统的响应速度。 4. **...

    zookeeper 可视化工具 直接运行jar 即可

    2. **创建和删除 Znode**:用户可以直接通过界面创建新的 Znode 或者删除已有的,方便进行测试和调试。 3. **编辑节点数据**:可以查看并修改 Znode 存储的数据,这对于验证配置或测试数据操作非常有用。 4. **监控...

    zookeeper 自己学习资料

    2. **Zookeeper的工作流程**:包括客户端连接、会话建立、请求处理、数据同步等过程。 3. **Zookeeper的操作命令**:如`ls`、`get`、`set`、`create`等,用于查看、修改和创建Znodes。 4. **Zookeeper的Watcher机制*...

    java源码剖析-Zookeeper-SourceAnalysis:Zookeeper源码剖析

    Zookeeper提供了丰富的Java API供开发者使用,包括创建、读取、更新和删除ZNode,设置和触发Watcher,以及进行会话管理等。了解这些API的内部实现有助于我们更好地利用Zookeeper。 七、Zookeeper源码分析 在源码...

    zookeeper免安装

    5. 会话和心跳机制:ZooKeeper通过会话和心跳检测来确保客户端与服务器之间的连接状态,当服务器发现客户端长时间无响应时,会断开连接。 6. 事务操作:ZooKeeper支持原子的读写操作,如创建、删除、设置数据和获取...

    zookeeper可视化图形工具

    而"Zookeeper可视化图形工具"则是为了帮助管理员更直观地管理和监控Zookeeper集群,简化操作流程。 Zookeeper GUI(图形用户界面)工具是为了解决命令行操作复杂、难以理解的问题,通过图形化界面,用户可以清晰地...

    zookeeper资料

    “zookeeper学习笔记.vsdx”可能是一个Visio图表,用于可视化Zookeeper的数据结构、工作流程或架构;而“zookeeper-trunk”可能是一个源码仓库,包含Zookeeper的源代码,适合深入理解其内部机制和进行二次开发。 ...

    Zookeeper单节点注册中心

    在本场景中,我们关注的是Zookeeper的单节点部署模式,这对于理解Zookeeper的基本工作原理和操作流程非常有帮助。 Zookeeper的核心概念包括节点(Znode)、会话(Session)和Watcher。Znode是Zookeeper数据存储的...

    【Zookeeper管理工具】

    总结来说,Zookeeper管理工具是管理和维护Zookeeper集群的重要辅助工具,它简化了操作流程,提高了运维效率。通过源码学习,开发者可以更深入地理解Zookeeper的工作原理,从而更好地应用到实际的分布式系统中。

    Zookeeper概述

    - **统一命名服务**:在分布式环境中,使用Zookeeper进行服务的统一命名,简化服务发现流程。 - **配置管理**:通过Zookeeper统一管理集群中的配置文件,实现动态更新和分发。 - **集群管理**:实时监控集群中各节点...

    zookeeper 教程资料

    5. **创建 myid 文件**:在数据目录下创建一个名为 `myid` 的文件,内容是当前节点的 ID(1-255),这将标识你的 Zookeeper 实例。 6. **启动 Zookeeper**:通过命令行输入 `zkServer.cmd start` 来启动 Zookeeper ...

    实验三 Zookeeper的安装和配置.docx

    3. **掌握ZooKeeper环境搭建流程**: - 首先需要下载并解压ZooKeeper源码包。 - 修改`conf/zoo_sample.cfg`配置文件,设置必要的参数如服务器列表等。 - 创建数据目录,并在每个数据目录下创建`myid`文件,文件...

    Zookeeper

    Zookeeper的数据模型类似文件系统,由一系列Znode构成,每个Znode有父节点和子节点,但与文件系统不同的是,Znode可以有数据也可以有子节点,同时支持顺序节点(创建时自动添加编号)。 ### 4. 功能应用 - **命名...

    zookeeper 操作代码 部分可用,

    通常,测试代码会包括创建ZNode,写入数据,读取数据,然后删除ZNode的流程,如果这部分代码存在问题,我们可以逐一排查,确保每个步骤都按照预期执行。 总结来说,理解和使用ZooKeeper的关键在于熟悉其数据模型、...

    zookeeper 例子

    2. **会话(Session)**: 客户端与Zookeeper服务器之间的连接被称为会话。会话具有超时时间,如果在超时时间内客户端与服务器失去联系,Zookeeper会认为客户端已经消失,相应地处理临时节点。 3. **Watcher**: ...

    dubbo 启动说明

    启动过程中,会与Zookeeper建立连接,并将自己的服务注册到Zookeeper上,同时保持心跳通信以维持会话(session)的有效性。具体步骤如下: 1. **环境准备**:确保Eclipse已安装Dubbo插件。 2. **项目配置**:在...

Global site tag (gtag.js) - Google Analytics