首先谈谈rpc的实现方式。
就底层实现方式来说,有同步和异步两种方式:
- 1. 同步调用:client发送一次rpc请求到server,在server返回结果之前,在client和server之间建立的connection一直被本次调用hold住,如果有其他的调用想使用此connection发送新的rpc请求,则必须等待。client端接收到server的返回结果之后,释放connection的占用,本次调用结束。
- 2. 异步调用:client发送一次rpc请求到server,client只向对应的connection写入请求即可,之后并不hold住connection;其他后续的调用可以继续向相同的connection里写入rpc的调用请求。当server返回结果,client读取每次rpc的对应调用结果。
上层对rpc调用的暴露的封装接口,可以是同步和异步的两种方式:
- 1. 同步调用:底层可以是同步方式或者异步的实现方式。这里值得一提的是,底层实现是异步方式,但是对外暴露的封装接口是可以转化成同步的方式的(就是一个简单的技巧而已wait—notify)
- 2. 异步方式:底层的实现方式一般也是异步方式。当然底层的实现也是同步,只不多这个时候上层要做额外的异步封装。
表 1 rpc调用的处理方式
底层实现方式 | 暴露的接口 | 处理结果的方式 |
同步 | 同步 | 直接读取结果 |
异步 | 同步 | wait-notify处理结果 |
异步 | 异步 | 注册回调函数 |
通过阅读hadoop的rpc实现代码,可以知道,其采用的是底层使用异步发送数据;上层以同步方式暴露接口。因此,有几个问题需要处理(其实,一般的网络调用,也就这些问题):
- 1.怎么标识同一个请求,即服务器返回的结果必须与请求对应起来(切记,这很重要,如果请求1得到请求2的结果,如果服务器没有对这种异常进行处理的话,整个client-server的通信就乱套了,这种情况在实际开发中还真遇到过)。
- 2.怎么处理超时情况,一般而言,client-server之间的通信,发送一个请求后,若sever没有返回结果,不会无限制的等待下去,因此都会设置一个超时时间,进行超时处理;
- 3.怎么处理异常情况,比如网络出现问题时,connection其实已经失效,这时候读写数据都会发生错误。
解决方案:
- 1. 标识同一个请求(call),这很简单,只要保证同一个connection内,给其分配一个惟一id作为标识即可,可根据id找到对应的call
- 2.超时也很简单,在创建连接的时候,设置超时时间即可,当超时时,可以标记此次操作失败,但是不一定需要关闭连接;
- 3.当网络出现异常时,读写出现错误时,则需要关闭掉连接,处理所有的还没有收到结果的请求。
上面都是从client的角度来看的,但是server端来看处理,处理如何呢?
server的处理方式, 我已经在
http://jimmee.iteye.com/blog/673212,
http://jimmee.iteye.com/blog/765267 分析过使用每种方式处理请求的问题。
这里再对nio的reactor模式提一下:
具体的处理方式:
- 1.一个线程来处理所有连接(使用一个Selector)
- 2.一组线程来读取已经建立连接的数据(多个Selector,这里的线程数一般和cpu的核数相当);
- 3.一个线程池(这个线程池大小可以根据业务需求进行设置)
- 4.一个线程处理所有的连接的数据的写操作(一个Selector)
- 大小: 89.4 KB
分享到:
相关推荐
使用Hadoop的RPC机制创建一个协议接口、通信服务端、通信客户端程序 目标:通过该任务,理解分布式系统中远程过程调用协议,掌握分布式系统中客户机与服务器的通信机制。
1.java接口操作Hadoop文件系统(文件上传下载删除创建......2.RPC远程过程调用的java代码实现,便于理解Hadoop的RPC协议,具体使用方法可参考我的博客https://blog.csdn.net/qq_34233510/article/details/88142507
Hadoop里的RPC机制过程,代码示例rpc调用过程
RPC(RemoteProcedureCall)——远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPCServer实现了一种抽象的RPC服务,同时提供Call队列。RPCServer作为服务提供者由两个...
这些天一直奔波于长沙和武汉之间,忙着腾讯的笔试、面试,以至于对hadoopRPC(RemoteProcedureCallProtocol,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。...
hadoop Common – 是hadoop的核心,包括文件系统、远程调用RPC的序列化函数。 HDSF : 提供高吞吐量的可靠分布式文件系统是 GFS的开源实现。 •Hadoop的文件系统。必须通过hadoop fs 命令来读取。支持分布式。 ...
(1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的。因此,它经常用于分布式网络通信中。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间...
hadoop入门级的代码 Java编写 eclipse可运行 包含 hdfs的文件操作 rpc远程调用的简单示例 map-reduce的几个例子:wordcount 学生平均成绩 手机流量统计
Hadoop 培训课程(2)HDFS 分布式文件系统与HDFS HDFS体系结构与基本概念*** HDFS的shell操作*** java接口及常用api*** ---------------------------加深拓展-------------...RPC调用** HDFS的分布式存储架构的源码分析**
您的选择,您可以用Hadoop 0.20.203通过1.xy(说话HDFS_NN_v1 / HDFS_DATANODE_AP_1_0 ),2.0.x版本的Hadoop( HDFS_NN_v2 / HDFS_DATANODE_AP_2_0 ),或Hadoop2.2.x的和更高的( HDFS_NN_v2_2 / HDFS_DATANODE_...
TaskTracker周期性地向JobTracker发送心跳报告,在RPC调用返回结果后,解析结果得到JobTracker下发的运行Task的指令,即LaunchTaskAction,就会在TaskTracker节点上准备运行这个Task。Task的运行是在一个与...
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 [1] Spring框架无缝集成。 Dubbo是一款高性能、轻量级的开源Java RPC框架,...
如何实现基于HTTP协议和TCP协议的RPC调用,它们之间有何差别,分别适应何种场景。 如何实现服务的动态注册和路由,以及软负载均衡的实现。 1.1 基于TCP协议的RPC 3 1.1.1 RPC名词解释 3 1.1.2 对象的...
AvroParquet 示例 ... 远程过程调用 (RPC)。 与动态语言的简单集成。 代码生成不需要读取或写入数据文件,也不需要使用或实现 RPC 协议。 代码生成作为一种可选的优化,只值得为静态类型语言实现。