【Hadoop】RPC Client Workflow

Client端比Server端简单,只有两种线程:

  • Client线程:发起RPC的主线程
  • Connection线程:每一个ConnectionId (由<remoteAddress, protocol, ticket>组成)唯一对应一个Connection线程,用以接受server端的response


如上图所示,基本的工作流程如下:

  1. Client线程将输入参数值封装成Call,Call在原来的基础上增加了RPC完成标志和RPC返回值信息;随后,创建一个Connection
  2. 用ConnectionId作为key,将新建的Connection放入Client的Connection Map,以callId作为key,将之前的Call放入Connection的Call Map
  3. 通过socket建立连接,并发送RPC Header和Protocal Header
  4. 启动Connection线程
  5. Connection线程监听socket,等待server response;同时,Client线程发送RPC Parameters
  6. Client等待Call返回,call.wait()
  7. Connection线程收到response,唤醒Client线程读取Call返回值,call.notify()
与server建立连接是比较expensive的操作,Connection Map实际上是一个Connection Pool,用于复用之前创建的Connection。在复用Connection的情况下,工作流程有所不同。

如上图所示,复用Conneciton的工作流程如下:
  1. 之前创建的Connection在完成上次的任务后,如果Call Map为空,将开始wait直到timeout
  2. Client线程将输入参数值封装成Call;随后,从Connection Map中取出现有Connection
  3. 以以callId作为key,将之前的Call放入Connection的Call Map,接着notify此Connection线程
  4. Connection线程被唤醒后,开始监听socket,等待server response;同时,Client线程发送RPC Parameters
  5. Client等待Call返回,call.wait()
  6. Connection线程收到response,唤醒Client线程读取Call返回值,call.notify()
可以看到,复用Connection,不需要重新建立连接和发送RPC Header及Protocal Header。当然,Connection Map中的Connection不会一直保持连接,在timeout时间后如果Call Map还是为空,那么Connection将会关闭连接,并将自己从Connection Map中移除。

Code-level
  1. org.apache.hadoop.ipc.Client.call(Writable, ConnectionId)
  2. org.apache.hadoop.ipc.Client.getConnection(ConnectionId, Call)
  3. org.apache.hadoop.ipc.Client.Connection.setupIOstreams()
  4. org.apache.hadoop.ipc.Client.Connection.receiveResponse()
  5. org.apache.hadoop.ipc.Client.Connection.sendParam(Call)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值