无情 @ 2019-09-04 20:16:33 阅读(776)
hadoop rpc


一、什么是RPC

 

    RPC,即Remote Procdure Call,中文名:远程过程调用,

    rpc远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCPUDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

通俗的说就是:两台不同的服务器(不受操作系统限制),一个应用部署在Linux-A上,一个应用部署在Windows-BLinux-B上,若A想要调用B上的某个方法method(),由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语意和传达调用的参数。

 

如图:

 

 

二、基础技术

 

1java动态代理和反射:通过实现InvocationHandler接口实现。

 

2Java NIO:底层通过多路复用实现的IO

 

3、网络编程:Reactor(反应器)设计模式,一种为处理并发服务请求,并将请求提交到一个或者多个服务处理程序的事件设计模式

 

三、hadoop Rpc三要素

 

 

1、交互协议 org.apache.hadoop.ipc.VersionedProtocol

 

不同版本与签名的协议,就算同一个类名也无法通信

 

2、客户端: Client,封装请求数据,并接收Response

 

3、服务端: RPC.Server 处理客户端的连接请求,并处理相关业务,最后返回结果

 

 

四、 rpc客户端

 

 

1、RPC.getProxy: 

 客户端拿到协议对象,RPC.getProxy就是得到协议对象的方法,它默认先得到一个RpcEngine(默认实现是WritableRpcEngine

 

 

2、WritableRpcEngine:

 

生成代理对象

 

其实就实例化2个成员变量:

ConnectionID

保存目标地址(remoteAddressprotocol)和用户ticket,这三者可以唯一确定一个Connection

Client

主要完成的功能是发送远程调用信息并接收返回结果。

 

 

3、invoke

 

当我们调用客户端本地方法的时候,执行代理对象里面的invokeclient.call

就是网络通讯了。

 

 

 

 

rpc请求客户端(org.apache.hadoop.ipc.Client.Connection)的几个配置: 

 

 ipc.client.connection.maxidletime=10000   毫秒,最大时间,超过后客户端会断开和服务器的连接   

 

 ipc.client.connect.max.retries.on.timeouts=45  在连接超时后,客户端连接重试次数:

 

 ipc.client.tcpnodelay=true   客户端参数。或许可以考虑关闭Nagle算法,增加客户端响应速度 

 

 ipc.client.ping=true 当为true时,如果读取响应超时,则向服务器发送ping命令。

 

 ipc.ping.interval=60000 等待服务器响应的超时时间,单位为毫秒。当ipc.client.ping属性为true时,客户端将在不接收字节的情况下发送Ping命令。

 

五、 rpc服务端

 

 

Server端涉及到多个客户端的调用,所以使用了如下的设计,统称为Reactor设计模式。Reactor主要是基于多路复用的非阻塞IO实现的基于事件驱动的IO框架。Hadoop RPC底层使用的是Java NIO,而Java NIO正好就是一种多路复用的非阻塞IOJava NIO的重点就是在Selector

 

架构设计图

 

1)Listener

 

监听类,用以监听客户端发来的请求。同时Listener下面还有一个静态类,Listener.Reader,当监听器监听到用户请求,便用让Reader读取用户请求。

Listener主要负责Socket的监听以及Connection的建立,同时监控ClientSocket的数据可读事件,通知Connection进行processData,收到完成请求包以后,封装为一个Call对象(包含Connection对象,从网络流中读取的参数信息,调用方法信息),将其放入队列

 

 

2)Call

 

用以存储客户端发来的请求,这个请求会放入一个BlockQueue中;

 

每个call存放到callQueue队列

 

模型对象

 

 

 

3)Handler

 

请求(blockQueueCall)处理类,会循环阻塞读取callQueue中的call对象,并对其进行操作。

 

4)Responder

 

响应RPC请求类,请求处理完毕,由Responder发送给请求客户端。

它不断地检查响应队列中是否有调用信息,如果有的话,就把调用的结果返回给客户端


rpc请服务端可优化的配置

ipc.server.listen.queue.size=128 接受客户端连接的服务器的侦听队列的长度。

ipc.maximum.data.length=67108864 服务器可以接受的最大IPC消息长度(字节)64M

ipc.server.max.response.size=1024*1024  响应ipc请求消息的最大长度;再大的消息量,消息会被记录到log

ipc.server.handler.queue.size=100 handler最大线程数据

ipc.server.read.threadpool.size=1 reader最新线程数据

 

入口类 org.apache.hadoop.ipc.Server


疑问:Listener在创建Reader线程的时候为什么不用线程池而是根据配置的线程数直接创建线程???

 

六、 总结

 

 

核心主要流程