`

一个故事讲清楚NIO(转载)

 
阅读更多
假设某银行只有10个职员。该银行的业务流程分为以下4个步骤:

1) 顾客填申请表(5分钟);

2) 职员审核(1分钟);

3) 职员叫保安去金库取钱(3分钟);

4) 职员打印票据,并将钱和票据返回给顾客(1分钟)。

  我们看看银行不同的工作方式对其工作效率到底有何影响。

1 BIO方式
  每来一个顾客,马上由一位职员来接待处理,并且这个职员需要负责以上4个完整流程。当超过10个顾客时,剩余的顾客需要排队等候。

  我们算算这个银行一个小时到底能处理多少顾客?一个职员处理一个顾客需要10分钟(5+1+3+1)时间,一个小时(60分钟)能处理6个顾客,一共10个职员,那就是只能处理60个顾客。

  可以看到银行职员的工作状态并不饱和,比如在第1步,其实是处于等待中。

  这种工作其实就是BIO,每次来一个请求(顾客),就分配到线程池中由一个线程(职员)处理,如果超出了线程池的最大上限(10个),就扔到队列等待 。

2 NIO方式
  如何提高银行的吞吐量呢?

  思路:分而治之,将任务拆分开来,由专门的人负责专门的任务。

  具体来讲,银行专门指派一名职员A,A的工作就是每当有顾客到银行,他就递上表格让顾客填写,每当有顾客填好表后,A就将其随机指派给剩余的9名职员完成后续步骤。

  我们计算下这种工作方式下银行一个小时到底能处理多少顾客?

  假设顾客非常多,职员A的工作处于饱和中,他不断的将填好表的顾客带到柜台处理,柜台一个职员5分钟能处理完一个顾客,一个小时9名职员能处理:9*(60/5)=108。

  可见工作方式的转变能带来效率的极大提升。

      这种工作方式其实就NIO的思路。下图是非常经典的NIO说明图,mainReactor线程负责监听server socket,accept新连接,并将建立的socket分派给subReactor;subReactor可以是一个线程,也可以是线程池(一般可以设置为CPU核数),负责多路分离已连接的socket,读写网络数据,这里的读写网络数据可类比顾客填表这一耗时动作,对具体的业务处理功能,其扔给worker线程池完成。

  可以看到典型NIO有三类线程,分别是mainReactor线程、subReactor线程、work线程。不同的线程干专业的事情,最终每个线程都没空着,系统的吞吐量自然就上去了。

       



3 异步方式
  第二种工作方式有没有什么可以提高的地方呢?

  仔细查看可发现第3步骤这3分钟柜台职员是在等待中度过的,那怎么能让柜台职员保持满负荷呢?

  还是分而治之的思路,指派1个职员B来专门负责第3步骤。每当柜台员工完成第2步时,就通知职员B来负责与保安沟通取钱。这时候柜台员工可以继续处理下一个顾客。当职员B拿到钱之后,他会怎么办呢?他会通知顾客钱已经到柜台了,让顾客重新排队处理,当柜台职员再次服务该顾客时,发现该顾客前3步已经完成,直接执行第4步即可。

  我们可以算算通过这种方法,银行的吞吐量能提高到多少。

  假设职员B的工作非常饱和,柜台一个职员现在2分钟能处理完一个顾客,一个小时8名职员能处理:8*(60/2)=240。

  在当今web服务中,经常需要通过RPC或者Http等方式调用第三方服务,这里对应的就是第3步,如果这步耗时较长,通过异步方式将能极大降低资源使用率。

  jetty Continuations 就实现了上述异步方式,有兴趣的同学可以去尝试下(http://wiki.eclipse.org/Jetty/Feature/Continuations)。

  NIO+异步的方式能让少量的线程(资源)做大量的事情,这适用于很多应用场景,比如代理服务、api服务、长连接服务等等,这些应用如果用同步方式将耗费大量机器资源。尽管NIO+异步能提高系统吞吐量,但其并不能让一个请求的等待时间下降,相反可能会增加等待时间。

4 小结
  总结就一句:“分而治之,将任务拆分开来,由专门的人负责专门的任务”,这不仅在计算机领域生效,在整个社会领域都生效

转载地址:http://www.cnblogs.com/LBSer/p/4622749.html?tvd
分享到:
评论

相关推荐

    一个java NIO的例子

    本例子中的"NioServer"可能是一个简单的Java NIO服务器端程序,用于演示如何使用NIO进行网络通信。下面我们将深入探讨Java NIO的关键组件和工作原理。 1. **通道(Channel)**:通道是数据传输的途径,类似于传统的...

    java nio 尚硅谷 12讲 new

    - 通过选择器,一个线程可以同时处理多个通道的事件,实现高效的并发处理。 8. **管道(Pipe)** - 管道是两个线程之间单向的数据通道,常用于父子进程间或者线程间的通信。 9. **字符集转换** - NIO提供了...

    采用NIO实现一个Socket服务器

    在Java编程领域,NIO(New IO)是Java 1.4版本引入的一个新特性,全称为Non-blocking Input/Output,即非阻塞I/O。它与传统的BIO(Blocking IO)模型不同,NIO提供了更高效的数据读写方式,特别适合于高并发、低延迟...

    JAVA nio的一个简单的例子

    在这个“JAVA nio的一个简单的例子”中,我们将探讨如何使用Java NIO进行简单的服务器-客户端通信,并计算字符串的哈希值。 在传统的BIO模型中,每个连接都需要一个线程来处理,当并发连接数量增加时,系统会创建...

    一个NIO服务端,客户端的例子

    NIO(Non-blocking Input/Output,非阻塞输入/输出)是Java提供的一个高效、灵活的I/O模型,尤其适用于高并发、大数据传输的场景。Netty是一个基于NIO的高性能、异步事件驱动的网络应用程序框架,它极大地简化了网络...

    Java NIO系列教程(一) Java NIO 概述

    Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels、Buffers和Selectors。本文将详细介绍这三个组件的基础概念及其...

    java NIO.zip

    通道是NIO中的核心概念之一,它提供了从一个数据源(如文件、套接字)到另一个数据源的数据传输路径。Java NIO支持多种类型的通道,包括文件通道(FileChannel)、套接字通道(SocketChannel)和服务器套接字通道...

    Java NIO英文高清原版

    Netty是一个基于NIO的高性能、异步事件驱动的网络应用框架,它简化了网络编程,广泛应用于服务器端应用开发。 NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。以下是对这些核心概念的...

    JavaNIO chm帮助文档

    Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...

    javaNiO.doc

    为了解决这些问题,Java平台在JDK 1.4中引入了一个全新的I/O处理框架——NIO(New IO),即新I/O。本文将深入探讨传统I/O模型的问题,并详细介绍NIO的概念、优势以及其实现机制。 #### 2. 传统I/O模型及其局限性 ...

    Java IO NIO and NIO 2 无水印pdf

    Java IO NIO and NIO 2 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn...

    NIO 入门.chm,NIO 入门.chm

    而在NIO中,读写操作不会阻塞线程,而是返回一个状态表示是否可以继续进行操作,从而提高系统资源利用率。 5. **文件通道(FileChannel)**:FileChannel用于文件的读写,它支持映射文件到内存,以及文件的随机访问...

    IO和NIO区别

    在标准 IO 中,数据是以流的形式读取和写入的,而 NIO 则将数据读取到一个缓冲区,然后再进行处理。 2. 同步和异步 标准 IO 流是线程堵塞和同步的,当一个线程调用了 read() 或 write() 方法时,该线程将被堵塞,...

    Java IO NIO and NIO 2 epub

    Java IO NIO and NIO 2 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    java NIO实例

    传统的Java I/O模型(BIO)在处理大量并发连接时效率较低,因为它基于阻塞模式,一个线程只能处理一个连接,而NIO则允许单个线程同时处理多个连接,大大提高了性能。 `NIOServer.java`和`NIOClient.java`这两个文件...

    基于nio的简易聊天室

    在Java编程领域,NIO(New Input/Output)是一个重要的概念,它提供了非阻塞I/O操作的能力,相比传统的BIO(Blocking I/O),在处理大量并发连接时表现出更高的效率和性能。本项目"基于nio的简易聊天室"旨在通过NIO...

    java NIO socket聊天

    在Java NIO中,服务器端可以使用一个线程来处理多个客户端连接,这被称为“多路复用”或“选择器”模型,极大地减少了CPU资源的消耗,提高了系统的并发处理能力。 在传统的BIO模型中,每当一个新的客户端连接到来时...

    nio demo for nio学习笔记(体系结构以及模块介绍)

    例如,可以通过创建一个简单的服务器,使用ServerSocketChannel监听连接,SocketChannel处理客户端请求,结合Selector实现多路复用。同时,Buffer的使用也非常重要,学会如何正确地读写数据,以及如何有效地管理缓冲...

    NIO项目源码.zip

    - `java.nio.channels.SelectionKey`:每个已注册的通道都会有一个对应的SelectionKey,它包含了通道与选择器之间的关系以及感兴趣的事件类型。 3. NIO工作流程 - 打开通道:例如创建一个FileChannel或...

Global site tag (gtag.js) - Google Analytics