了解ZooKeeper客户端的实现,对于使用ZooKeeper的客户端非常重要。 通过对客户端源码的阅读,了解了如下信息:

创建ZooKeeper对象时,应会创建一个ClientCnxn(代表了客户端连接对象)。与此同时启动了两个线程:SendThread、EventThread。两个队列:outgoingQueue和pendingQueue。

同步调用:

同步调用,就是客户端成功发送请求后,才继续执行。例如:zk.create(path,data,acl,createMode);

这行代码会发起一个同步调用。一个线程A执行这个create时,会创建一个表示create动作的packet,放到数据发送队列outgoingQueue。之后当线程A就开始等待,直到SendThread线程从outgoingQueue队列取出该packet,并将其成功发送(已收到服务端的回应为准)。然后线程A才继续执行。

异步调用:

异步调用,就是客户端不会管请求是否发送成功,都会继续执行。例如:zk.create(path,data,acl,createMode,stringCallback);

这行代码会发起一个异步调用。一个线程A执行这个create时,会创建一个表示create动作的packet,放到数据发送队列outgoingQueue。线程A接着就去执行下一行代码了,而不会去管数据packet是否由SendThread线程发送到服务端了。

SendThread的职责:

1:创建一个长连接,用于会话保持

通过周期性的发送ping packet到当前连接的ZooKeeper服务器实例。这个过程,我们通常称为心跳。每当客户端与服务端的连接断开后,会自动重新连接到下一个服务器。如果断开的是最后与一个服务器的连接,那么会重新连接到第一个服务器。

2:使用这个长连接与服务器通信

1)发送客户调用

不断的从outgoingQueue取出packet发给服务端。当发送的是Client的同步调用的packet,则在发送packet后,立即通知客户端同步调用线程继续执行。当发送的是Client的异步调用,则会将packet发给服务端,并保存到pendingQueue。当从服务端发回响应后,生成一个packet 完成事件交给EventThread,由Event执行CallBack调用。

2)处理服务端响应

对服务端响应反序列化后,根据响应分类进行处理如下:

· Ping的响应:不做处理

· 认证失败的响应:创建认证失败的WatchedEvent,并将event交给EventThread处理。

· 服务端的数据变更通知:生成相应的数据变更WatchedEvent,并将event交给EventThread处理。

· 服务端对调用的回应:不论是同步调用还是异步调用,服务端都会给出回应。收到此类回应后,先是将watcher放到watcherManager中。然后对同步、异步做后续处理。

如果是同步调用,则通知发起调用的线程继续处理。

如果是异步调用,则将该packet交由EventThread来处理。例如对create、delete、exists、getData、getChildren方法调用的响应。

EventThread做了什么事呢?

从上述描述中,也可以看出EventThread用于对接收到的packet或者event进行处理:

· 如果是event,则从WatcherManager中取出相应的Watcher进行处理。

· 如果是packet,则执行相关联的AsyncCallback。

通过源码的阅读,知道在使用ZooKeeper客户端时要注意以下两点:

· 在进行Watcher回调时,会从WatchManager取出与相关path关联的多个Watcher(此时WatchManager中就不会再有这个path相关的Watcher了),然后串行的调用这多个Watcher#process方法。所以在编程时,会根据业务的需要,有可能会反复注册Watcher。

· 另外因为多个Watcher的调用是串行的,所以不要因为一个Watcher的处理逻辑影响了整个客户端的Watcher回调。

ZooKeeper:Java客户端网络处理的更多相关文章

  1. Apache Zookeeper Java客户端Curator使用及权限模式详解

    这篇文章是让大家了解Zookeeper基于Java客户端Curator的基本操作,以及如何使用Zookeeper解决实际问题. Zookeeper基于Java访问 针对zookeeper,比较常用的J ...

  2. Zookeeper Java客户端API的使用

    1. 原生api         具体查看下面github代码 2. ZkClient ZkClient是Github上一个开源的ZooKeeper客户端.ZkClient在ZooKeeper原生 A ...

  3. 9. 使用ZooKeeper Java API编程

    ZooKeeper是用Java开发的,3.4.6版本的Java API文档可以在http://zookeeper.apache.org/doc/r3.4.6/api/index.html上找到. Ti ...

  4. zookeeper的Java客户端API

    zookeeper作为一个分布式服务框架,主要用来解决分布式数据一致性问题,对多种语言提供了API.这里主要记录下JAVA客户端API的使用. 1.创建会话 客户端可以通过创建一个ZooKeeper实 ...

  5. Zookeeper的java客户端API使用方法(五)

    前面几篇博文,我们简单的介绍了一下zookeeper,如何安装zookeeper集群,以及如何使用命令行等.这篇博文我们重点来看下Zookeeper的java客户端API使用方式. 创建会话 客户端可 ...

  6. ZooKeeper学习总结(2)——ZooKeeper开源Java客户端ZkClient使用

    zkclient是zookeeper的Java客户端.它让Zookeeper API 使用起来更简单:它非常方便订阅各种事件并自动重新绑定事件(会话建立.节点修改.节点删除.子节点变更等):它提供了s ...

  7. 12. ZooKeeper之Java客户端API使用—创建会话。

    转自:https://blog.csdn.net/en_joker/article/details/78686649 客户端可以通过创建一个ZooKeeper(org.apache.zookeeper ...

  8. ZooKeeper学习之路(四)—— Java 客户端 Apache Curator

    一.基本依赖 Curator是Netflix公司开源的一个Zookeeper客户端,目前由Apache进行维护.与Zookeeper原生客户端相比,Curator的抽象层次更高,功能也更加丰富,是目前 ...

  9. zookeeper生产最广泛使用java客户端curator介绍及其它客户端比较

    关于zookeeper的原理解析,可以参见zookeeper核心原理详解,本文所述大多数实践基于对zookeeper原理的首先理解. Curator是Netflix公司开源的一个Zookeeper客户 ...

随机推荐

  1. 我的“第一次”,就这样没了:DDD(领域驱动设计)理论结合实践

    写在前面 插一句:本人超爱落网-<平凡的世界>这一期,分享给大家. 阅读目录: 关于DDD 前期分析 框架搭建 代码实现 开源-发布 后记 第一次听你,清风吹送,田野短笛:第一次看你,半弯 ...

  2. c += c-- | ++b;

    一切都是从这开始的 一个大一学弟通过QQ给我发来一个C++的题: int c = 8, b = 3; c += c-- | ++b; 问c的值是多少.通过笔算得到c为19,然后随手建了个C#控制台项目 ...

  3. Integer.parseInt 引发的血案

    Integer.parseInt 处理一个空字符串, 结果出错了, 程序没有注意到,搞了很久, 引发了血案啊!! 最后,终于 观察到了, 最后的部分: Caused by: java.lang.NoC ...

  4. python学习 异常

    #===========================常见异常 ===================== #print(a);#NameError: name 'a' is not defined ...

  5. sublime text 插件

    html-css-js prettify html5 anaconda pretty json JavaScript Completions SqlBeautifier Emmet Css Snipp ...

  6. JS原生第三篇 (帅哥)

    1.1 数 组 1. 数组           看电影    电影院  座位 大的变量     里面可以放很多的值 var  arr = [1,3,57]; var ar = new Array(); ...

  7. Notes:SVG(2)---各种常见图形

    1.矩形rect,指定rx,ry可以得到圆角矩形 <rect x="10" y="10" rx="10" ry="10&qu ...

  8. 自己动手,实现一种类似List<T>的数据结构(一)

    前言 上一篇文章<Unity3D中常用的数据结构总结与分析>简单总结了一下小匹夫工作中经常遇到的一些数据结构.不过小匹夫一直有种观点,就是光说的热闹实际啥也不做真的没啥意思.光说不练假把式 ...

  9. [Spring]支持注解的Spring调度器

    概述 如果想在Spring中使用任务调度功能,除了集成调度框架Quartz这种方式,也可以使用Spring自己的调度任务框架. 使用Spring的调度框架,优点是:支持注解(@Scheduler),可 ...

  10. AJAX(一)

    AJAX(一) Ajax是Asynchronous Javascript和XML的简写,这一技术能够向服务器请求额外的数据而无需卸载页面,会带来更好的用户体验. [前面的基础知识][关于同步和异步的了 ...