zookeeper的API围绕zookeeper的句柄而构建,每个句柄代表与zookeeper的一个会话。
已经建立的一个会话如果端口,这会话会转移到另一台zookeeper服务器上 只要会话还存活,这个句柄就有效,zookeeper客户端会保持这个活跃的连接,以保证与zookeeper服务器之间的会话存活。
如果句柄关闭,zookeeper客户端就会告知zookeeper服务器终止会话
如果zookeeper服务器发现客户端已经死掉,就会是这个会话无效
如果客户端之后尝试重新连接zookeeper服务器,使用之前无效会话对应的句柄进行连接,那么zookeeper服务器会通知客户端,这个会话已经失效,使用这个句柄进行的任何操作都会返回错误。
创建zookeeper句柄的构造函数:
Zookeeper(String connectString,int sessionTimeout,Watch watcher)
connectString中包含了主机名和zookeeper服务器的端口
sessionTimeout以毫秒为单位,表示zookeeper等待客户端通讯的最长时间。
watcher用于接收会话事件的一个对象,这个对象是我们自己创建的。需要实现Watcher接口。
实现一个简单的Watcher
public interface Watcher{
void process(WatchedEvent event);
}
public class Master implements Watcher {
Zookeeper zk;
Master(Zookeeper zk){
this.zk=zk;
}
void startZk() {
zk = Zookeeper(hostport,15000,this);
}
public void process(WatchedEvent event) {
System.out.println(event);
}
public static void main(String[] args) {
Master m = new Master();
m.startZk();
Thread.sleep(60000);
}
}
现在我们启动zookeeper服务器,然后运行Master,之后停止zookeeper服务器,并保持Master运行,你可以看到synchronized事件之后发生了Disconnected事件,当开发者遇到Disconnected事件时,不要重新创建一个新连接,zookeeper客户端库负责为你重新连接服务,当不幸遇到网络问题或者服务器故障时,zookeeper可以处理这些故障问题。
请不要尝试去管理zookeeper客户端连接。zookeeper客户端库会监控与zookeeper服务之间的连接,客户度库不仅告诉我们连接发生了问题,还会主动尝试重新建立通讯。
为了确保同一时间只有一个主节点进程处于活动状态,可以使用zookeeper实现简单的群首选举算法。所有潜在主节点进程都尝试创建/master节点,但只有一个能成功,这个成功的进程就是主节点。
常量ZooDefs.Ids.OPEN_ACL_UNSAFE为所有人提供了所有权限。
zookeeper可以通过插件式的认证方法提供了每个节点的ACL策略功能。
可以通过以下代码尝试获得主节点权限:
zk.create("/master",
serverId.getBytes(),
OPEN_ACL_UNSAFE,
CreateMode.Ephemeral);
使用create方法会抛出两种异常:KeeperException和InterruptedException。我们需要确保我们处理了这两种异常,特别是ConnectionLossException(KeeperException异常的子类)和KeeperException。对于其他异常我们可以忽略继续执行,但是对于这两种异常,create方法可以已经成功了,所哟如果我们作为主节点就需要捕获并处理他们。
ConnectionLossException异常发生于客户端与zookeeper服务器失去连接时,一般常见的原因由于网络原因导致,例如网络分区或者zookeeper服务器故障。当这个异常发生时,客户端并不知道是在zookeeper服务器处理前丢失请求消息,还是在处理后客户端为收到响应消息。
InterruptedException异常源于客户端线程调用了Thread.interrupt,通常这是应为应用程序部分关闭,但还在被其他相关应用的方法使用。从字面看这个异常,进程会中断本地客户端的请求处理的进程,并使该请求处于为之状态。
以上两种请求都会导致正常请求处理过程的中断。
处理ConnectionLossException异常时,在群首选举时,我们需要找到/master节点,如果进程是自己,就开始成为群首角色,可以使用getData(String path,bool watch,Stat stat)代码获得当前/master节点的数据。
zookeeper中所有同步调用方法都有对应的异步调用方法。通过异步调用方法,我们可以在单线程中同时进行多个调用,同时也可以简化我们的实现方式。
void create(
String path,
byte[] data,
List<ACL> acl,
CreateMode createMode,
AsynCallback.StringCallback cb,(提供回调方法的对象)
Object ctx(用户指定上下文信息,回调方法调用时传入的对象实例)
)
回调对象实现只有一个方法StringCallback接口:
void processResult(int rc,String path,Object ctx,String name)
rc:返回调用的结果,OK或者与KeeperException异常对应的编码值
path:我们传给create的path值
ctx:我们传给create的上下文参数
name:创建的znode节点名称
调用成功后。path与name的值一样,但是如果采用Create.Sequential模式,这两个参数值就不会相等。
注意:只有一个单独的线程会所有回调函数,如果回调函数阻塞,所有后续回调调用都会阻塞,因此一般不要在回到函数中集中操作或者阻塞操作。
zookeeper会严格维护执行顺序,并提供强有力的有序保证,然而,在多线程下还是需要小心面对顺序问题,多线程下,当回调函数中包含重试逻辑的代码时,一些常见的场景都可能导致错误发生,当遇到ConnectingLossException异常而补发一个请求时,新建立的请求可能排序在其他线程中的请求之后,而实际上其他线程中的请求应该在原来请求之后。

转载于:https://www.cnblogs.com/use-D/p/10487106.html

第三章:开始使用zookeeper的API相关推荐

  1. 2.ZooKeeper客户端Curator「第三章 ZooKeeper Java客户端」「架构之路ZooKeeper理论和实战」

    前言 上一篇文章 介绍了zookeeper原生API的使用,使用过原生API不得不说,有很多的问题,比如:不能递归创建和删除节点.Watcher只能使用一次.还有很多可以解决分布式应用问题的api(比 ...

  2. C++ API 设计 08 第三章 模式

    第三章 模式 前一章所讨论的品质是用来区分设计良好和糟糕的API.在接下来的几个章节将重点关注构建高品质的API的技术和原则.这个特殊的章节将涵盖一些有用的设计模式和C++ API设计的相关习惯用法. ...

  3. zookeeper使用(三):项目中zookeeper的配置 和 zookeeper C API的使用

    zookeeper使用(三):项目中zookeeper的配置 和 zookeeper C API的使用 一:假定一个项目需求 假设我要启动多台proxy服务,有一个网页客户端需要连接我这台proxy服 ...

  4. Zookeeper C API 指南

    以前自己的博客中转载.翻译或写过(不过自己才疏学浅,写的不好)一些 Zookeeper 方面的文章,但是都没有涉及到 Zookeeper C API 的内容,今天的这篇博客是我农历新年的第一篇技术博客 ...

  5. 《Hadoop权威指南》第三章 Hadoop分布式文件系统

    <Hadoop权威指南>第三章 Hadoop分布式文件系统 目录 前言 HDFS的设计 HDFS的概念 命令行接口 Hadoop文件系统 Java接口 数据流 通过distcp并行复制 注 ...

  6. 《深入理解 Spring Cloud 与微服务构建》第三章 Spring Cloud

    <深入理解 Spring Cloud 与微服务构建>第三章 Spring Cloud 文章目录 <深入理解 Spring Cloud 与微服务构建>第三章 Spring Clo ...

  7. 在Java中构建响应式微服务系统——第三章 构建响应式微服务

    第三章 构建响应式微服务 在本章中,我们将使用Vert.x构建我们的第一个微服务.由于大多数微服务系统使用HTTP进行交互,因此我们将以HTTP微服务作为开始.但是由于系统包含多个相互通讯的微服务,因 ...

  8. 【第三章:Java开发岗:Redis篇】

    点击:[第一章:Java开发岗:基础篇] HashMap.Synchronized.ThreadLocal.AQS.线程池.JVM内存模型.内存屏障.class文件结构.类加载 机制.双亲委派.垃圾回 ...

  9. Zookeeper C API 指南一(转)

    Zookeeper 监视(Watches) 简介 Zookeeper C API 的声明和描述在 include/zookeeper.h 中可以找到,另外大部分的 Zookeeper C API 常量 ...

  10. Effective Java 读书笔记----第三章

    第三章 对于所有通用的方法 主要讲的是对Object类的非final方法(equals,hashCode,toString,clone和finalize)覆盖的一些规则 1.覆盖equals时请遵守通 ...

最新文章

  1. 综合评价模型的缺点_浅谈交通影响评价中不同交通预测方法的特性
  2. linux 进程(二) --- 进程的创建及相关api
  3. linux socket 多人聊天软件,Linux Socket编程---TCP实现多客户端的网络聊天室
  4. 单体架构到微服务架构的带来的变化
  5. 数学家田野:感谢坐冷板凳的那六年
  6. 圣诞节平面设计师排版|首选手写字体素材,简单但非常好用。
  7. php complex,PHP復雜的基於角色的訪問控制列表
  8. python必备基础代码-【Python基础系列】常见的数据预处理方法(附代码)
  9. AOSP ~ Camera - YUV格式简介
  10. 微信小程序转发分享及好友点击进入传参
  11. Android 百度翻译API(详细步骤+源码)
  12. ADO与ADO.NET 的区别
  13. ubuntu18打开网页慢的问题
  14. python-基础语法-glob.glob()
  15. 一文带你了解800万像素车载摄像头
  16. 字符串之间的大小比较方法
  17. 关于微信小程序云开发,申请退款接口返回“订单不存在”的问题
  18. 大学计算机基础考试提纲,大学计算机基础期末复习提纲.doc
  19. java 上传mp3文件大小,Java获取音频文件(MP3)的播放时长
  20. dw cc創建html5頁面

热门文章

  1. web-4. 装饰页面的图像
  2. shell基础09 归档数据
  3. 关于IDE集成开发环境,Pycharm小技巧
  4. 《Head First Servlets JSP》-11-Web应用部署
  5. CSS3 Transform 变形
  6. CheckBox的触发
  7. ConcurrentHashMap(JDK1.8)的源码解析
  8. python学习-- Django根据现有数据库,自动生成models模型文件
  9. iOS开发 Xcode10报错缺少libstdc++.6.0.9.tbd
  10. MySQL_Ubuntu安装