对hadoop之RPC的理解 (5)

对hadoop之RPC的理解

 

 

    这里mainReactor负责监听socket连接事件,readReactor负责监听IO读事件,respondSelector负责监听IO写事件,这里会构造多个readReactor降低系统的负载,不同的Reader线程会根据一定的逻辑到不同的readReactor上注册IO读事件。当acceptor建立了socket连接后,会从readers线程池中取出一个reader线程去出发RPC请求的流程。Reader线程会根据一定的逻辑选出一个readReactor对象并在这个对象上注册读取RPC请求的IO事件。之后就会由该readReactor在网络监听是否有RPC请求到达,并出发Reader线程读取,当handler成功处理一个RPC请求后,就会向respondSelector注册写RPC响应IO事件,当socket输出流管道可以写数据时,sender类就可以将响应发送个客户端了。

3.3.4、server类的设计

server类的设计结构如下所示,基本和多个reactor多线程版本的设计模式类似。

对hadoop之RPC的理解

 

 

 Listener:类似于Reactor模式中的mainReactor,Listener对象中存在一个Selector对象acceptSelector,负责监听来自客户端的Socket请求,当acceptSelector监听到连接请求后,Listener对象会初始化这个连接,之后采用轮询的方式从readers线程池中选出一个reader线程处理RPC请求的读取操作。

Reader:与Reactor模式中的Reader线程相同,用于RPC读取请求,Reader线程类中存在一个Selector对象readSelector,类似Reactor模式中的readReactor,这个对象用于监听网络中是否可以读取的RPC请求。当readSelector坚挺到有可读的RPC请求后,会唤醒Reader线程读取这个请求,并将请求封装在一个Call对象中,然后将这个Call对象放入CallQueue队列中。

Handler:与Reactor模式中的Handler类似,用于处理RPC请求并发回响应,Handler对象会从CallQueue中不停的取出RPC请求,然后执行RPC请求对应的本地函数进行处理,最后封装响应发回给客户端。

Responder:用于向客户端发送RPC响应,会在Responder内部的respondSelector上注册一个写响应事件,这里的respondSelector和Reactor中的respondSelector概念相同,当respondSelector坚挺到网络情况具备写响应的条件时,会通知Responder将剩余的响应发回给客户端

server类处理RPC请求的处理流程:

Listener线程的acceptSelector在ServerSocketChannel上注册OP_ACCEPT事件,并且创建readers线程池,每个Reader的readSelector此时并不监控任何的Channel。

Client发送socket连接请求,出发Listener的acceptSelector唤醒Listener线程。

Listener调用ServerSocketChannel.accept()创建一个新的SocketChannel

Listener从readers线程池中挑选一个线程,并在Reader的readSelector上注册OP_READ事件

Client发送RPC请求数据报,出发Reader的selector唤醒Reader线程

Reader从socketChannel中读取数据,封装成Call对象,然后放入共享对垒CallQueue中

handlers线程池的线程都在CallQueue上阻塞,当有Call对象被放入后,其中一个Handler线程被唤醒,然后根据Call对象的信息滴哦用BlockingServer对象的callBlockingMethod()方法,然后Handler将响应写入SocketChannel中。

如果handler发现无法将响应完全写入到SocketChannel中,将在Responder的respondSelector上注册一个OP_WRITE时间,当socket恢复正常,Responder将被唤醒继续写响应。

Server类的内部类介绍:

Listener类:是一个线程类,整个Server中只会有一个Listener线程,用于监听来自客户端的Socket连接请求,对于每一个新到达的socket连接请求,Listener都会从readers线程池中选择一个Reader线程处理,Listener中定义了一个Selector对象,负责监听SelectionKey.OP_ACCEPT事件。

Reader类:是一个线程类,每个Reader线程都会负责读取若干个客户端连接发来的RPC请求,而在Server类中会存在多个Reader线程构成一个readers线程池,readers线程池并发的读取RPC请求,提高了Server处理RPC请求速度,Reader类定义了自己的readSelector字段,用于箭筒SelectionKey.OP_READ事件。

Connection类:维护Server和Client之间的Socket连接,Reader线程会调用readAndProcess()方法从IO流中读取一个RPC请求

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzpff.html