Hadoop异步rpc通信机制--org.apache.hadoop.ipc.Server
Java NOI非阻塞技术不是开启线程去等待端口的响应,而是采用Reactor模式或Observer模式监听I/O端口,当端口有响应时,会自动通知我们,从而实现流畅的I/O读写。
Java NOI中selector可视为一个观察者,只要我们把要观察的SocketChannel告诉Selector(注册的方式),我们就可以做其余的事情,等到已告知Channel上有事情发生时,Selector会通知我们,传回一组SelectionKey,我们读取这些Key,就可以获得Channel上的数据了。
Client端的底层通信直接采用了阻塞式IO编程,Server是采用Java NIO机制进行RPC通信:
java NIO参考资料:
http://www.iteye.com/topic/834447
http://weixiaolu.iteye.com/blog/1479656
=========================================================================================================================
Server是一个abstract类,抽象之处在call方法中,RPC.Server是ipc.Server的实现类,RPC.Server的构造函数调用了ipc.Server类的构造函数的,Namenode在初始化时调用RPC.getServer方法初始化了RPC.Server:
public synchronized void start() throws IOException { responder.start(); listener.start(); handlers = new Handler[handlerCount]; for (int i = 0; i < handlerCount; i++) {//可以有多个处理线程 handlers[i] = new Handler(i); handlers[i].start(); } }stop()操作类似,不再赘述。=========================================================================================================================
【总结】
Server采用Java NIO非阻塞技术。
Listener用于接收客户端的连接,把连接加入到connectionList内,同时调用Connection的方法进行版本校验、建立Call并将Call加入到callQueue中。
Handler是处理线程,用于从callQueue中取出请求进行处理,调用Respond.doRespond将call加入到responseQueue。
Respond是响应线程,用于将responseQueue上的响应写给对应的Client,同时doPurge清理掉长期不响应的连接。