Hadoop RPC类详解(4)
来源:互联网 发布:软件接口设计工具 编辑:程序博客网 时间:2024/05/21 15:03
Acceptor:接受来自Client的连接,建立与Client对应的Handler,并向Reactor注册此Handler。
Handler:与一个Client通信的实体,并按一定的过程实现业务的处理。Handler内部往往会有更进一步的层次划分,用来抽象诸如read、decode、compute、encode和send等过程。在Reactor模式中,业务逻辑被分散的I/O事件所打破,所以Handler需要有适当的机制在所需的信息还不全(读到一半)的时候保存上下文,并在下一次I/O事件到来的时候(另一半可读)能继续上次中断的处理。
Reader/Sender:为了加速处理速度,Reactor模式往往构建一个存放数据处理线程的线程池,这样数据读出后,立即扔到线程池中等待后续处理即可。为此,Reactor模式一般分离Handler中的读和写两个过程,分别注册成单独的读事件和写事件,并由对应的Reader和Sender线程处理。
ipc.Server实际上实现了一个典型的Reactor设计模式,其整体架构与上述完全一致。一旦读者了解典型Reactor架构便可很容易地学习ipc.Server的设计思路及实现。接下来,我们分析ipc.Server的实现细节。
前面提到,ipc.Server的主要功能是接收来自客户端的RPC请求,经过调用相应的函数获取结果后,返回给对应的客户端。为此,ipc.Server被划分成3个阶段:接收请求、处理请求和返回结果,如图3-9所示。各阶段实现细节如下。
(1)接收请求
该阶段主要任务是接收来自各个客户端的RPC请求,并将它们封装成固定的格式(Call类)放到一个共享队列(callQueue)中,以便进行后续处理。该阶段内部又分为建立连接和接收请求两个子阶段,分别由Listener和Reader两种线程完成。
整个Server只有一个Listener线程,统一负责监听来自客户端的连接请求,一旦有新的请求到达,它会采用轮询的方式从线程池中选择一个Reader线程进行处理,而Reader线程可同时存在多个,它们分别负责接收一部分客户端连接的RPC请求,至于每个Reader线程负责哪些客户端连接,完全由Listener决定,当前Listener只是采用了简单的轮询分配机制。
Listener和Reader线程内部各自包含一个Selector对象,分别用于监听SelectionKey.OP_ACCEPT和SelectionKey.OP_READ事件。对于Listener线程,主循环的实现体是监听是否有新的连接请求到达,并采用轮询策略选择一个Reader线程处理新连接;对于Reader线程,主循环的实现体是监听(它负责的那部分)客户端连接中是否有新的RPC请求到达,并将新的RPC请求封装成Call对象,放到共享队列callQueue中。
(2)处理请求
该阶段主要任务是从共享队列callQueue中获取Call对象,执行对应的函数调用,并将结果返回给客户端,这全部由Handler线程完成。
Server端可同时存在多个Handler线程,它们并行从共享队列中读取Call对象,经执行对应的函数调用后,将尝试着直接将结果返回给对应的客户端。但考虑到某些函数调用返回结果很大或者网络速度过慢,可能难以将结果一次性发送到客户端,此时Handler将尝试着将后续发送任务交给Responder线程。
(3)返回结果
前面提到,每个Handler线程执行完函数调用后,会尝试着将执行结果返回给客户端,但对于特殊情况,比如函数调用返回结果过大或者网络异常情况(网速过慢),会将发送任务交给Responder线程。
Server端仅存在一个Responder线程,它的内部包含一个Selector对象,用于监听SelectionKey.OP_WRITE事件。当Handler没能将结果一次性发送到客户端时,会向该Selector对象注册SelectionKey.OP_WRITE事件,进而由Responder线程采用异步方式继续发送未发送完成的结果。
- Hadoop RPC类详解(4)
- Hadoop RPC类详解(2)
- Hadoop RPC类详解(3)
- Hadoop RPC 详解(参数调优)
- Hadoop RPC详解-RMI
- Hadoop RPC(续)
- hadoop RPC(一)
- Hadoop RPC源码解析——RPC框架详解
- hadoop 2.0 中的两种RPC详解
- Hadoop通信协议——RPC原理详解
- RPC详解(补)
- Hadoop RPC源码解析——Server类(一)
- Hadoop RPC源码解析——Server类(二)
- hadoop RPC
- hadoop RPC
- Hadoop RPC
- Hadoop RPC
- Hadoop RPC
- RGB和HSV
- elasticsearch-sql插件
- Hadoop RPC类详解(2)
- Hadoop RPC类详解(3)
- 未名湖边的烦恼引起的递归问题探讨
- Hadoop RPC类详解(4)
- Hadoop RPC 详解(参数调优)
- 对synchronized关键字的理解
- 芒果iOS开发之git新手常用操作
- YARN RPC实现
- 《Java Web程序开发入门》知识总结(三)
- android美化对话框
- YARN RPC应用实例(1)
- 一起talk C栗子吧(第八十四回:C语言实例--使用信号进行进程间通信一)