Hadoop 源代码分析(七)RPC

聊完了Client 聊Server,按惯例,先把类图贴出来。

需要注意的是,这里的Server 类是个抽象类,唯一抽象的地方,就是Java 代码1. public abstract Writable call(Writable param, long receiveTime) throws IOException;这表明,Server 提供了一个架子,Server 的具体功能,需要具体类来完成。而具体类,当然就是实现call 方法。我们先来分析Server.Call,和Client.Call 类似,Server.Call 包含了一次请求,其中,id 和param 的含义和Client.Call是一致的。不同点在后面三个属性,connection 是该Call 来自的连接,,当然,当请求处理结束时,相应的结果会通过相同的connection,发送给客户端。属性timestamp 是请求到达的时间戳,如果请求很长时间没被处理,对应的连接会被关闭,客户端也就知道出错了。最后的response 是请求处理的结果,可能是一个Writable 的串行化结果,也可能一个异常的串行化结果。Server.Connection 维护了一个来之客户端的socket 连接。它处理版本校验,读取请求并把请求发送到请求处理线程,接收处理结果并把结果发送给客户端。Hadoop 的Server 采用了Java 的NIO,这样的话就不需要为每一个socket 连接建立一个线程,读取socket 上的数据。在Server中,只需要一个线程,就可以accept 新的连接请求和读取socket 上的数据,这个线程,就是上面图里的Listener。请求处理线程一般有多个,它们都是Server.Handle 类的实例。它们的run 方法循环地取出一个Server.Call,调用Server.call方法,搜集结果并串行化,然后将结果放入Responder 队列中。

对于处理完的请求,需要将结果写回去,同样,利用NIO,只需要一个线程,相关的逻辑在Responder 里。

更多精彩内容请关注:

关注超人学院微信二维码:

你的脸是为了呈现上帝赐给人类最贵重的礼物–微笑,

Hadoop 源代码分析(七)RPC

相关文章:

你感兴趣的文章:

标签云: