`

IO系列文章之五:读《Scalable io in java》看Socket网络编程模型演变

 
阅读更多

最近利用业余时间在看Java NIO,期间读了线程大师Doug Lea那篇很经典的《Scalable IO in Java》。在此写一写看过之后,对于Socket编程模型演变的一些理解。

首先,对于网络编程,一般都有一个共同的流程:

(1)读请求.

(2)解码请求.

(3)计算处理逻辑.

(4)编码响应.

(5)发送响应.

 

一、经典阻塞IO模型:

(图片来源:《Scalable io in java》ppt,下同)

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

这种模型由于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关闭时,会进入阻塞状态,直到全部数据都发送完或者超时。

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

 

二、非阻塞IO模型(单线程):

如图,这里用到了Reactor模式。

关于Reactor模式的一些概念:

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

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

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

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

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

 

三、非阻塞IO模型(多线程):

 

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

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

 

四、非阻塞IO模型(多Reactor):

如图,Reactor拆分为mainReactor和subReactor,subReactor线程个数可以跟CPU个数一样。

其中,mainReactor监听server socket,accept新连接。

subReactor负责读写网络数据,业务处理逻辑仍旧分发到线程池由worker线程完成。

 

附:《Scalable IO in Java》原文地址找不到了,百度文库中地址: 

http://wenku.baidu.com/view/ad5ef8b069dc5022aaea00a1.html 

 

 

 

 

 

 

  • 大小: 35.9 KB
  • 大小: 34.8 KB
  • 大小: 47.8 KB
  • 大小: 49.6 KB
分享到:
评论
1 楼 yuanliangding 2016-08-20  
java里的select不是要用户自己调了?然后拿出key一个个的检查状态。
会回调的是另一种模式了

相关推荐

    Scalable IO in Java

    ### Scalable IO in Java:详解Java NIO与网络服务扩展性设计 #### 一、概述 在《Scalable IO in Java》这篇文章中,作者Doug Lea深入探讨了如何利用Java NIO(非阻塞I/O)技术实现可扩展的网络服务。随着互联网...

    Scalable IO in Java doug lea.zip

    《Scalable IO in Java》是由Java领域知名专家Doug Lea撰写的一本关于Java高性能I/O编程的著作。这本书深入探讨了如何在Java环境中实现可扩展的输入/输出操作,特别是利用非阻塞I/O(Non-blocking I/O,简称NIO)...

    scalable-io-in-java-中文1

    Scalable IO in Java 关注的是在网络服务场景下如何实现高效、可扩展的输入输出处理。在Java中,尤其在处理高并发的网络连接时,传统的阻塞IO模型(如基于`java.io`的`ServerSocket`)可能会成为性能瓶颈,因为它会...

    Scalable IO in Java.pdf

    文件标题和描述提到了Java中的可伸缩IO(Scalable IO in Java),文档的标签为“nio”,即Java的非阻塞IO(New I/O),这是Java在1.4版本中引入的一个新的包java.nio,为IO提供了一种新的方式。 首先,文档提到了...

    Scalable IO in Java.rar

    在服务端,注册服务对某个端口进行监听,然后使用阻塞的accept()函数,来取出请求队列中的socket,或者一直等待,直到收到客户端的请求。连接建立后,服务端接受输入流进行处理,返回结果给客户端。最后通信结束,...

    Practical Node.js: Building Real-World Scalable Web Apps, 2nd Edition

    Learn how to build a wide range of scalable real-world web applications using a professional development toolkit. If you already know the basics of Node.js, now is the time to discover how to bring it...

    Practical Node.js: Building Real-World Scalable Web Apps

    Jade and Handlebars template engines, Stylus and LESS CSS languages, OAuth and Everyauth libraries, and the Socket.IO and Derby libraries, and everything in between. The book also covers how to ...

    Professional Node.js Building Javascript Based Scalable Software

    本书《专业Node.js:构建基于JavaScript的可扩展软件》由Pedro Teixeira撰写,并由John Wiley & Sons, Inc.出版,为读者提供了一个深入学习Node.js及其核心概念的机会。 #### 第一部分:介绍与设置 - **安装Node.js...

    Scalable Network Programming Or The Quest For A Good Web Server

    ### 可扩展网络编程或寻求优秀的Web服务器 #### 摘要 本文旨在探讨如何编写高性能的网络服务器,特别是能够处理大规模并发连接(例如10000个客户端)的Web服务器。文章深入分析了在设计与实现这类服务器时可能遇到...

    Professional Node.js-Building Javascript Based Scalable Software

    第五部分,构建Web应用程序(Building Web Applications),深入介绍了如何使用Express.js构建Web应用、如何使用Socket.IO创建通用的实时Web应用。这部分内容对于现代Web开发人员尤为重要,因为它们提供了解决实时...

    A robust and scalable chat application built using Next JS, Sock

    A robust and scalable chat application built using Next JS, Socket.IO, Redis, Kafka, and PostgreSQL. Designed to handle high concurrency …

    英文版清晰有目录pdf版本的 Building Scalable Apps with Redis and Node.js

    本书《Building Scalable Apps with Redis and Node.js》由作者Joshua Johanan撰写,旨在指导读者如何使用Redis和Node.js构建可扩展的应用程序。本书在亚马逊上评分高达4.4/5分,表明其内容得到了专业读者的认可和...

    echo-server:Echo Server是一个支持Docker且可扩展的Node.js应用程序,用于托管您自己的Socket.IO服务器以进行Laravel广播

    它建立在Socket.IO之上,并且在下面具有Pusher兼容的API服务器,这使在Laravel中的实现变得轻而易举。 这是经过大量修改的原始的分支。 :handshake: 配套 GitHub上的Renoki Co.和Soketi致力于将很多开源项目和...

    一个可伸缩的使用完成端口服务器的例子

    压缩包内的文件"CodeProject Scalable Servers with IO Completion Ports and How to Cook Them_ Free source code and programming help.mht"可能是一个包含文章和源代码的MHT(单个文件网页)文档,提供了关于如何...

    Node.js Web Development

    Node.js is a server-side JavaScript platform using an event-driven, non-blocking I/O model allowing users to build fast and scalable data-intensive applications running in real time. This book gives ...

Global site tag (gtag.js) - Google Analytics