zookeeper学习心得二:同步与异步
2017-04-23 14:45
316 查看
上一节中,我们看到很多操作zk节点的方式有同步和异步两种方式,那么问题来了:
(1)两种方式有什么区别?
(2)哪种方式更好?应该用那种方式来写代码?
(3)最好的方式有哪些其他方面的知识?
本节我们从这三个角度来分析这个问题,毕竟基础得好才可以更好的学习更深的内容。
(1)同步调用中,需要处理异常。
(2)异步调用中已经把异常封装为返回码。 同时异步调用会得到更好的性能。这里要注意,一般来说异步调用会在命令发送到Zookeeper服务器之前,就返回继续执行之后的代码。
因为回调函数里会有返回的服务器响应码,通过响应码我们可以了解操作有没有成功,没有成功可以通过调用方法来实现第二次尝试,比如生成一个节点,将生成节点的操作放进一个类中,通过服务器响应码来判断是否生成成功,如果没有成功,则继续调用该方法,直到成功为止。
实现接口的类型中还必须要实现相应的public void processResult(int rc, String path, Object ctx, String name) 函数,可能不同的回调函数有不同的字段。
字段解读:
int rc:Result code,服务端响应码,客户端可以从这个响应码中识别API调用的结果,常见响应码如下:
(1)0(ok):接口调用成功。
(2)-4(ConnectionLoss):客户端和服务端连接已断开。
(3)-110(NodeExists):指定节点已存在。
(4)-112(SessionExpired):会话已过期。
通过Code.get(rc)方法可以将rc转换成相应的英文标识符,例如下面:
String path:接口调用时传入的API的数据节点的节点路径参数值
Object ctx:接口调用时传入的API的ctx参数值
String name:节点的名称
这里我一直有一个疑问:zookeeper中回调函数用来干嘛?难道就是用来将这些信息打印出来?因为processResult是没有返回类型的,除非我在回调函数里直接定义几个字属性,然后将processResult方法中的一些内容存进这些属性里,利用这些属性的get方法来返回结果,只有当结果正确了才继续执行主程序下一步的操作,但是这样是不是又是多余的操作。以上只是我的猜测,猜测回调函数在zookeeper中的用处。
(1)两种方式有什么区别?
(2)哪种方式更好?应该用那种方式来写代码?
(3)最好的方式有哪些其他方面的知识?
本节我们从这三个角度来分析这个问题,毕竟基础得好才可以更好的学习更深的内容。
1、同步 OR 异步
ZooKeeper提供的Java API.每一个方法有一个异步调用版本。异步调用和同步调用的区别之处:(1)同步调用中,需要处理异常。
(2)异步调用中已经把异常封装为返回码。 同时异步调用会得到更好的性能。这里要注意,一般来说异步调用会在命令发送到Zookeeper服务器之前,就返回继续执行之后的代码。
2、推荐使用异步方法
推荐使用异步方法访问Zookeeper,除了可以简化异常处理,提高性能外。还应为Watcher的处理是异常的。这样在构建复杂逻辑时,代码会更统一些。因为回调函数里会有返回的服务器响应码,通过响应码我们可以了解操作有没有成功,没有成功可以通过调用方法来实现第二次尝试,比如生成一个节点,将生成节点的操作放进一个类中,通过服务器响应码来判断是否生成成功,如果没有成功,则继续调用该方法,直到成功为止。
3、异步回调函数类型
使用异步方式创建接口只需要实现AsyncCallback.StringCallback()接口即可,同时AsyncCallbackH还包含了StatCallback、DataCallback、ACLCallback、ChildrenCallback、Children2Callback、StringCallback和VoidCallback七种不同的回调接口,用户可以在不同的异步接口中实现不同的接口。实现接口的类型中还必须要实现相应的public void processResult(int rc, String path, Object ctx, String name) 函数,可能不同的回调函数有不同的字段。
字段解读:
int rc:Result code,服务端响应码,客户端可以从这个响应码中识别API调用的结果,常见响应码如下:
(1)0(ok):接口调用成功。
(2)-4(ConnectionLoss):客户端和服务端连接已断开。
(3)-110(NodeExists):指定节点已存在。
(4)-112(SessionExpired):会话已过期。
通过Code.get(rc)方法可以将rc转换成相应的英文标识符,例如下面:
switch (Code.get(rc)) { case CONNECTIONLOSS: System.out.println("CONNECTIONLOSS"); break; case OK: System.out.println("OK"); System.out.println("--ctx--"+ctx+"--"+name+"--path--"+path); break; case NODEEXISTS: System.out.println("NODEEXISTS"); break; default: System.out.println("DEFAULT"); break; }
String path:接口调用时传入的API的数据节点的节点路径参数值
Object ctx:接口调用时传入的API的ctx参数值
String name:节点的名称
这里我一直有一个疑问:zookeeper中回调函数用来干嘛?难道就是用来将这些信息打印出来?因为processResult是没有返回类型的,除非我在回调函数里直接定义几个字属性,然后将processResult方法中的一些内容存进这些属性里,利用这些属性的get方法来返回结果,只有当结果正确了才继续执行主程序下一步的操作,但是这样是不是又是多余的操作。以上只是我的猜测,猜测回调函数在zookeeper中的用处。
相关文章推荐
- 同步和异步学习
- IO的学习笔记 - 同步,异步,阻塞,非阻塞
- Node.js学习(5)----异步I/O和同步
- 网络编程学习_设计模式_半同步半异步模式
- TinyOS 同步与异步处理学习心得
- C#文件同步学习心得
- boost库学习随记六:使用同步定时器、异步定时器、bind、成员函数回调处理、多线程的同步处理示例等
- 应用程序对设备 + IRP 的同步异步学习
- 学习mina同步与异步网络通讯(二)——服务器端
- IO中同步、异步与阻塞、非阻塞的区别 分类: 嵌入式开发学习 2014-04-11 13:47 193人阅读 评论(0) 收藏
- 片上总线Wishbone 学习(八)周期的同步结束和异步结束
- 学习数据库同步个人心得
- Linux学习心得之——Rsync同步配置
- 应用程序对设备 + IRP 的同步异步学习
- AJAXPro用法,关于JS同步和异步调用后台代码的学习
- AJAXPro用法,关于JS同步和异步调用后台代码的学习
- linux驱动学习之 同步/异步 阻塞/非阻塞
- mysql主从同步延迟方案解决的学习心得
- iOS学习笔记——同步请求下载与异步请求下载
- Nio学习2——基础名词:同步和异步,阻塞和非阻塞