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
简单的代码实现:
对于每一个请求都分发给一个线程,每个线程中都独自处理上面的流程。
这种模型由于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
代码实现:
这里用到了reactor模式。
关于reactor模式的一些概念:
reactor:负责响应io事件,当检测到一个新的事件,将其发送给相应的handler去处理。
handler:负责处理非阻塞的行为,标识系统管理的资源;同时将handler与事件绑定。
reactor为单个线程,需要处理accept连接,同时发送请求到处理器中。
由于只有单个线程,所以处理器中的业务需要能够快速处理完。
改进:使用多线程处理业务逻辑。
worker thread pools
参考代码:
将处理器的执行放入线程池,多线程进行业务处理。但reactor仍为单个线程。
继续改进:对于多个cpu的机器,为充分利用系统资源,将reactor拆分为两部分。
using multiple reactors
参考代码:
mainreactor负责监听连接,accept连接给subreactor处理,为什么要单独分一个reactor来处理监听呢?因为像tcp这样需要经过3次握手才能建立连接,这个建立连接的过程也是要耗时间和资源的,单独分一个reactor来处理,可以提高性能。
参考:
http://www.cnblogs.com/fxjwind/p/3363329.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
http://www.cnblogs.com/luxiaoxun/p/4331110.html