搬运工
搬运工

Hadoop RPC 源码详解

原文地址http://www.toutiao.com/a6821044562270618115/ 一、什么是RPC

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

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

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

如图:

Hadoop RPC 源码详解

二、基础技术

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

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

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

三、hadoop Rpc三要素

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

Hadoop RPC 源码详解

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

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

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

四、 rpc客户端

1、RPC.getProxy:

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

Hadoop RPC 源码详解

2、WritableRpcEngine:

生成代理对象

Hadoop RPC 源码详解

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

ConnectionID:

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

Client:

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

Hadoop RPC 源码详解

3、invoke

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

就是网络通讯了。

Hadoop RPC 源码详解

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正好就是一种多路复用的非阻塞IO,Java NIO的重点就是在Selector。

架构设计图

Hadoop RPC 源码详解

1)Listener

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

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

Hadoop RPC 源码详解

2)Call

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

Hadoop RPC 源码详解

每个call存放到callQueue队列

模型对象

Hadoop RPC 源码详解

3)Handler

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

Hadoop RPC 源码详解

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线程的时候为什么不用线程池而是根据配置的线程数直接创建线程???

六、 总结

核心主要流程

Hadoop RPC 源码详解

百度 https://cloud.baidu.com/product/textcensoring 文本审核结果 {"errno":0,"msg":"success","data":{"log_id":5027205174236552035,"result":{"spam":0,"review":[],"reject":[],"pass":[{"score":0.003000000026077,"hit":[],"label":1},{"score":0.003000000026077,"hit":[],"label":2},{"score":0,"hit":[],"label":3},{"score":0.20153820895522,"hit":[],"label":4},{"score":0.0010000000474975,"hit":[],"label":5},{"score":0,"hit":[],"label":6}]}}}
2020-05-03 15:17:05
0 热度