HBase学习之:HBase RPC

举报
Lettle whale 发表于 2020/06/04 20:37:05 2020/06/04
【摘要】 学习HBase的RPC可以为学HBase打好基础,因为RPC是HMaster,RegionServer和Client通信的纽带

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的连接请求和数据,其中数据封装成CallPUSHCall队列。

HBaseServer.Handler

RPC ServerCall处理者,和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 ClientRPC 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处理。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。