【HDFS】HADOOP-11552.Allow handoff on the server side for RPC requests
今天来分析一下
HADOOP-11552. Allow handoff on the server side for RPC requests.
这个之前没有使用场景,也没有细看,所以一直不明白它到底是做什么的?
最近在做Router RPC异步化,涉及到这个feature的使用,因此决定深入学习一下,特此记录。
根据ISSUE的描述,HDFS的RPC Server侧目前有这样一个问题。
Handler线程被每一个到来的RPC请求占满,直到这个请求处理完为止。
这是不合理的,因为这种设计建立在RPC全是short-time的情况,实际上,RPC是I/O-bound的,
可能会出现RPC执行很久的情况,那Handler线程就会一直阻塞,不能处理其他RPC请求。
基于上述问题背景,HADOOP-11552对现有RPC流程进行了优化。
我这里按照我的理解先总结一下,具体细节,以及源码可以参见后文。
如果在当前Handler线程里注册了某个特殊回调(用ThreadLocal保存)标记的话,
那么在org.apache.hadoop.ipc.ProtobufRpcEngine2.Server.ProtoBufRpcInvoker#call里会立即返回null,
不阻塞Handler线程,并延迟给客户端发送RPC响应(deferResponse),
等到这个回调的setResponse方法调用时,才触发发送响应的逻辑(sendDeferedResponse)。<