天天看点

《Scalable IO in Java》笔记

scalable io in java

<a href="http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf">http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf</a>

基本上所有的网络处理程序都有以下基本的处理过程:

read request

decode request

process service

encode reply

send reply

classic service designs

《Scalable IO in Java》笔记

简单的代码实现:

《Scalable IO in Java》笔记
《Scalable IO in Java》笔记

对于每一个请求都分发给一个线程,每个线程中都独自处理上面的流程。

这种模型由于io在阻塞时会一直等待,因此在用户负载增加时,性能下降的非常快。

server导致阻塞的原因:

1、serversocket的accept方法,阻塞等待client连接,直到client连接成功。

2、线程从socket inputstream读入数据,会进入阻塞状态,直到全部数据读完。

3、线程向socket outputstream写入数据,会阻塞直到全部数据写完。

client导致阻塞的原因:

1、client建立连接时会阻塞,直到连接成功。

2、线程从socket输入流读入数据,如果没有足够数据读完会进入阻塞状态,直到有数据或者读到输入流末尾。

3、线程从socket输出流写入数据,直到输出所有数据。

4、socket.setsolinger()设置socket的延迟时间,当socket关闭时,会进入阻塞状态,直到全部数据都发送完或者超时。

改进:采用基于事件驱动的设计,当有事件触发时,才会调用处理器进行数据处理。

basic reactor design

《Scalable IO in Java》笔记

 代码实现:

《Scalable IO in Java》笔记
《Scalable IO in Java》笔记

这里用到了reactor模式。

关于reactor模式的一些概念:

reactor:负责响应io事件,当检测到一个新的事件,将其发送给相应的handler去处理。

handler:负责处理非阻塞的行为,标识系统管理的资源;同时将handler与事件绑定。

reactor为单个线程,需要处理accept连接,同时发送请求到处理器中。

由于只有单个线程,所以处理器中的业务需要能够快速处理完。

改进:使用多线程处理业务逻辑。

worker thread pools

《Scalable IO in Java》笔记

 参考代码:

《Scalable IO in Java》笔记
《Scalable IO in Java》笔记

将处理器的执行放入线程池,多线程进行业务处理。但reactor仍为单个线程。

继续改进:对于多个cpu的机器,为充分利用系统资源,将reactor拆分为两部分。

using multiple reactors

《Scalable IO in Java》笔记

参考代码:

《Scalable IO in Java》笔记
《Scalable IO in Java》笔记

mainreactor负责监听连接,accept连接给subreactor处理,为什么要单独分一个reactor来处理监听呢?因为像tcp这样需要经过3次握手才能建立连接,这个建立连接的过程也是要耗时间和资源的,单独分一个reactor来处理,可以提高性能。

参考:

http://www.cnblogs.com/fxjwind/p/3363329.html

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

http://www.cnblogs.com/luxiaoxun/p/4331110.html