点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!


作者:zhanlijun

原文链接:http://www.cnblogs.com/LBSer

前言

假设某银行只有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 小结

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

热门内容:
  • 今天终于搞懂了:为什么 Java 的 main 方法必须是 public static void?

  • 七个开源的 SpringBoot 前后端分离项目,Star过千,快去收藏夹吃灰吧!

  • 道友自诉:入职中软一个月(外包华为)就离职了!

  • 腾讯推出高性能 RPC 开发框架

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)

牛逼!一个故事讲清楚 NIO 了相关推荐

  1. 一个故事讲清楚 NIO

    假设某银行只有10个职员.该银行的业务流程分为以下4个步骤: 1) 顾客填申请表(5分钟): 2) 职员审核(1分钟): 3) 职员叫保安去金库取钱(3分钟): 4) 职员打印票据,并将钱和票据返回给 ...

  2. 一个故事讲清楚NIO

    本文为转载文章,原文链接:http://www.cnblogs.com/LBSer/p/4622749.html 假设某银行只有10个职员.该银行的业务流程分为以下4个步骤: 1) 顾客填申请表(5分 ...

  3. 一个故事讲清楚BIO NIO 异步

    转载请引用:一个故事讲清楚NIO 假设某银行只有10个职员.该银行的业务流程分为以下4个步骤: 1) 顾客填申请表(5分钟): 2) 职员审核(1分钟): 3) 职员叫保安去金库取钱(3分钟): 4) ...

  4. [Python] 小明又迟到了……一个故事讲清楚 Python 循环嵌套

    Python 语言允许在一个循环体里面嵌入另一个循环.循环嵌套的语法形式如下: 1.Python for 循环嵌套: 语法: for iteration_var in sequence:for ite ...

  5. 这么说吧,NIO很简单,其实就是个牛逼IO

    我是风月连城,喜欢用简单的语言阐述知识点 长期分享原创java文章,分享进阶架构师学习笔记及学习资料 喜欢的可以点赞关注,共同学习,一起进步 0 ) 哈哈,其实我是个标题党,NIO不是牛逼IO,是非阻 ...

  6. 怎一个牛逼了得?如果可以,我愿连用三个!

    阅读本文大概需要18分钟. 这是我的一个粉丝读者,后来我们成为朋友. 这个读者的经历很神奇,少年就成名但后面却经历各种坎坷,因为疫情家道中落,原本富二代的他,只能放弃创业开始找工作,他的经历值得大家参 ...

  7. 如何成为一个牛逼的程序员

    一个快乐的人,不是因为他拥有的多,而是因为他计较的少:心态比勤劳更重要,用心做好事. 作为程序员,身边总是有牛逼的前辈.后辈或者同辈.牛逼的人总是让人羡慕.比如自己苦搞一天的 BUG ,头发快抓掉完了 ...

  8. 【转】如何成为一个牛逼的程序员

    来自:http://www.cnblogs.com/preacher/p/4205277.html   说的很有道理!!! 上边这个网站不是原文网站,,,原文网站地址:http://blog.csdn ...

  9. 使用 Redis 实现一个轻量级的搜索引擎,牛逼啊 !

    来源 | http://github.com/jasonGeng88/blog/blob/master/201706/redis-search.md 场景 大家如果是做后端开发的,想必都实现过列表查询 ...

最新文章

  1. yolov3(三:算法框架解析)
  2. AI人才「用工荒」如何解决?看看这几家顶级公司的应对策略
  3. idea在Mybatis的xml里面写sql时,表名、字段、报红问题的解决方法
  4. chrome浏览器无法上网_浏览器无法上网
  5. ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  6. java8 垃圾 不同_【不同的Java垃圾回收器的比较】
  7. 《C++ Primer 5th》笔记(7 / 19):类
  8. 嵌入式专业名词整理(以后会不断完善)
  9. JQuery快速入门详解
  10. 基于spss的偏相关分析(partial correlation analysis)
  11. CCNA考试题库中英文翻译版及答案7
  12. html列表自动无限循环滚动,js 无限循环垂直滚动列表
  13. 第七章、Spring Boot MyBatis升级篇
  14. 【C++】操作符重载
  15. css字体_在css中如何引入ttf文件的字体
  16. B/S聊天室(websocket)
  17. 是什么使Slider Revolution成为最好的WordPress Slider插件?
  18. Python爬虫:史上最详细的Python爬虫库urllib讲解,绝对经典,值得收藏
  19. 解析高考新政策,来帮助孩子找到适合的专业:编程是未来世界人和机器交流交往的语文
  20. 创新案例分享 | 建设交通运输管理信息系统,全面提升执法能力

热门文章

  1. [PHP] JQuery+Layer实现添加删除自定义标签代码
  2. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)
  3. C#ListView控件添加Checkbox复选框并获取选中的数目,检查checkbox是否勾选
  4. SPOJ ATOMS - Atoms in the Lab
  5. activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
  6. 有关RDS上只读实例延时分析-同适用于自建MySQL主从延时分析判断
  7. 【WA】九度OJ题目1435:迷瘴
  8. Flex精华摘要--使用AS脚本
  9. 基于 OpenCV 的人脸追踪
  10. 库克退休前的最后一战:不是苹果汽车而是……