hadoop RPC
上边是一张hadoop RPC很粗糙的类图,只包含其中主要的类关系
hadoop RPC的总架构是
Client端使用的是阻塞的Socket,
Client的Connection内部类负责Socket的操作
setupIOStream方法建立socket连接
sendParam(call)方法传输客户端socket数据
receiveResponse会阻塞等待服务端的response
客户端Client没有使用NIO, 而是使用Connection线程的对象池,以ConnectionID为主键。
-------------------------------------------------------------------------------------------------------------
Server端使用的是非阻塞的Socket 大量使用Selector
Server的Listener内部类负责接收Socket请求,并开启reader的线程池,在需要读取数据时,wakeup selector--唤醒读线程;Listener中的Reader内部类负责读取socket数据(具体的操作还是在Listener和Connection中,可见reader这个内部类是因为效率而后加的),读取的数据也包括hadoop的头数据,封装为Call对象,放到Server下的队列中
Server的Handler内部类负责获取队列中的Call对象,并且调用处理类Call,返回处理后的的value,并且调用doRespond,wakeup-selector--唤醒写线程
Server的Responder内部类负责写入相应信息。
Server只负责启动listener,handler,responder各个线程,让其各执其责。
他并不是继承与Thread,但是其包含大量Thread,所有的服务操作都要在这一个Server中进行,个人认为这也暴漏了hadoop架构的缺陷
public synchronized void start() {
responder.start(); //启动responder
listener.start(); //启动listener
handlers = new Handler[handlerCount];
for (int i = 0; i < handlerCount; i++) {
handlers[i] = new Handler(i);
handlers[i].start(); //逐个启动Handler
}
}