HBase学习之:HBase RPC
1.1 1 RPC
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。 首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
交互过程如下图所示:
1.2 HBase.ipc
1.2.1 2.1 Server
RPC Server实现了一种抽象的RPC服务,同时提供Call队列。
Ø RPC Server结构
结构 (类) |
功能 |
HBaseServer.Listener |
RPC Server的监听者,用来接收RPC Client的连接请求和数据,其中数据封装成Call后PUSH到Call队列。 |
HBaseServer.Handler |
RPC Server的Call处理者,和Server.Listener通过Call队列交互。 |
HBaseServer.Responder |
RPC Server的响应者。HBaseServer.Handler按照异步非阻塞的方式向RPC Client发送响应,如果有未发送出的数据,交由HBaseServer.Responder来完成。 |
HBaseServer.Connection |
RPC Server数据接收者。提供接收数据,解析数据包的功能。 |
HBaseServer.Call |
持有客户端的Call信息。 |
Ø RPC Server主要流程
RPC Server作为服务提供者由两个部分组成:接收Call调用和处理Call调用。
接收Call调用负责接收来自RPC Client的调用请求,编码成Call对象后放入到Call队列中。这一过程由Listener线程完成。具体步骤:
1. Listener线程监视RPC Client发送过来的数据。
2. 当有数据可以接收时,Listener启动Reader线程,reader线程调用Connection的readAndProcess方法接收并处理数据。
3. Connection边接收边对数据进行处理,如果接收到一个完整的Call包,则构建一个Call对象PUSH到Call队列中,由Handler线程来处理Call队列中的所有Call。
4. Handler线程监听Call队列,如果Call队列非空,按FIFO规则从Call队列取出Call。
5. 将Call交给RPC.Server处理。(在WritableRpcEngine.Server类中,该类是HBaseServer的子类)。
6. 借助JDK提供的Method,完成对目标方法的调用,目标方法由具体的业务逻辑实现。
7. 返回响应HBaseServer.Handler按照异步非阻塞的方式向RPC Client发送响应,如果有未发送出的数据,则交由Server.Responder来完成。
1.2.2 Client
RPC Client是Client的实现和入口类。
Ø RPC Client结构
结构 |
功能 |
HBaseClient.ConnectionId |
到RPC Server对象连接的标识。 |
HBaseClient.Call |
Call调用信息。 |
HBaseClient.ParallelResults |
Call响应。 |
WritableRpcEngine.Invoker |
对InvocationHandler的实现,提供invoke方法,实现RPC Client对RPC Server对象的调用。 |
Invocation |
用来序列化和反序列化RPC Client的调用信息。(主要应用JAVA的反射机制和InputStream/OutputStream) |
Ø RPC Client主要流程
每一个Call都是由RPC Client发起。步骤说明:
1. RPC Client发起RPC Call,通过JAVA反射机制转化为对Client.call调用。
2. 调用getConnection得到与RPC Server的连接。每一个RPC Client都维护一个HashMap结构的到RPC Server的连接池。具体建立连接的流程见下图。
3. 通过Connection将序列化后的参数发送到RPC服务端。
4. 阻塞方式等待RPC服务端返回响应。
1.2.3 同步
客户端发起的RPC调用是同步的,而服务端处理RPC调用是异步的。客户端调用线程以阻塞同步的方式发起RPC连接及RPC调用,将参数等信息发送给Listener,然后等待Connection接收响应返回。
Listener负责接收RPC连接和RPC数据,当一个Call的数据接收完后,组装成Call,并将Call放入由Handler提供的Call队列中。
Handler线程监听Call队列,如果Call队列不为空,则按FIFO方式取出Call,并转为实际调用,以非阻塞方式将响应发回给Connection,未发送完毕的响应交给Responder处理。
- 点赞
- 收藏
- 关注作者
评论(0)