HDFS RPC客户端处理流程详解

源头:

在ProtobufRpcEngine.Invoker的invoke()方法中会调用client.call()方法。

  • 将RPC请求信息封装成一个Call对象

  • 创建Connection对象管理客户端和服务端的Socket连接

    • Call对象会放入Connection.calls字段中

    • Connection对象会放入Client.connections字段中以供复用。

  • 通过Connection.setupIOstreams()方法建立客户端与服务端的Socket的连接

  • setupIOstreams()方法还会启动Connection线程,该线程的作用是监听Socket中服务端返回的响应信息

  • 通过Connection.sendRpcRequest()方法发送RPC请求到Server。

在2.8.5的源码中,call方法有两种模式可以选择:一种是同步的,一种是异步的,同步的就是等待服务端返回响应结果再返回;异步的就是先返回null,等服务端返回响应后再获得结果。

我们先讨论一下同步的情况。

同步模式

Call

从上面的流程中,我们可以发现发送请求和接受响应是由两个独立的线程进行的。发送请求线程就是调用Client.call()方法的线程,而接收响应线程则是在建立Socket连接后启动的Connection线程。在同步模式下,这两个线程是怎么配合的呢?这里就用到了Call类。发送请求线程在发送请求到Server后会在请求对应的Call对象上调用Call.wait()方法等待Server发回响应信息。接收响应线程当监听到服务端返回响应信息后会首先设置

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值