以一个故事讲清楚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的思路。如下图所示,mainReactor线程负责监听server socket,accept新连接,并将建立的socket分派给subReactor;subReactor可以是一个线程,也可以是线程池(一般可以设置为CPU核数),负责多路分离已连接的socket,读写网络数据,这里的读写网络数据对应着顾客填表这一耗时动作,对具体的业务处理功能,其扔给worker线程池完成。

  这里可以看到有三类线程,分别是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+异步的方式能让少量的线程(资源)就可以做大量的事情,值得注意的是其并不能让一个请求的等待时间下降,相反可能会增加等待时间。

4 小结

  总结就一句:“分而治之,将任务拆分开来,由专门的人负责专门的任务”。

时间: 2024-12-14 22:03:37

以一个故事讲清楚NIO的相关文章

一个故事讲清楚NIO(转)

转载请引用:一个故事讲清楚NIO 假设某银行只有10个职员.该银行的业务流程分为以下4个步骤: 1) 顾客填申请表(5分钟): 2) 职员审核(1分钟): 3) 职员叫保安去金库取钱(3分钟): 4) 职员打印票据,并将钱和票据返回给顾客(1分钟). 我们看看银行不同的工作方式对其工作效率到底有何影响. 1 BIO方式 每来一个顾客,马上由一位职员来接待处理,并且这个职员需要负责以上4个完整流程.当超过10个顾客时,剩余的顾客需要排队等候. 我们算算这个银行一个小时到底能处理多少顾客?一个职员处

java NIO (二) 一个故事讲清楚NIO

假设某银行只有10个职员.该银行的业务流程分为以下4个步骤: 1) 顾客填申请表(5分钟): 2) 职员审核(1分钟): 3) 职员叫保安去金库取钱(3分钟): 4) 职员打印票据,并将钱和票据返回给顾客(1分钟). 我们看看银行不同的工作方式对其工作效率到底有何影响. 1 BIO方式 每来一个顾客,马上由一位职员来接待处理,并且这个职员需要负责以上4个完整流程.当超过10个顾客时,剩余的顾客需要排队等候. 我们算算这个银行一个小时到底能处理多少顾客?一个职员处理一个顾客需要10分钟(5+1+3

关于SVM--支持向量机的一个故事

关于SVM(support vector machine)--支持向量机的一个故事 很久很久以前,有个SVM, 然后,……………………被deep learning 杀死了…………………………………… 完结……撒花 故事的起源: 好吧,关于支持向量机有一个故事 ,故事是这样子的: 在很久以前的情人节,大侠要去救他的爱人,但魔鬼和他玩了一个游戏. 魔鬼在桌子上似乎有规律放了两种颜色的球,说:“你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用.” 于是大侠这样放,干的不错? 然后魔鬼,又在桌上放

(转)一个故事讲完https

(转)一个故事讲完https 2 1  序言 今天来聊一聊https 安全传输的原理. 在开始之前,我们来虚构两个人物, 一个是位于中国的张大胖(怎么又是你?!), 还有一个是位于米国的Bill (怎么还是你?!). 这俩哥们隔着千山万水,通过网络联系上了, 两个人臭味相投,聊得火热. 此时正值米国大选, 张大胖亲切地"致电"Bill, 对米国总统大选的情况表示强烈地关注. Bill则回电说谢谢关心米国人的事情我们米国人自己做主,不用你们歪果仁瞎操心...... 张大胖继续"

创业,首先你得讲好一个故事

如今,内容在市场营销中扮演的角色越来越重要,但是对于你的公司来说,如果没有一个故事,就意味着没有内容可以创造.传播.你的公司是做什么的?或者往更深层次一点挖掘,你的公司代表的是什么?如果想要回答这个问题,完全可以用一种强大的方式,那就是讲故事. 你公司所要讲述的故事,既要教育用户,也要娱乐用户,而这也是你构建内容的重点,因此它可以帮助提升企业“能见度”,构建“信任度”,还可以为 你的网站驱动更多访问流量.从电子邮件营销,到社交媒体,你传导给客户群的信息里面必须要有一定的内容支持,因此,如果你是第

区块链:一个故事告诉你比特币的原理及运作机制

一个故事告诉你比特币的原理及运作机制 周末花时间看了一些比特币原理相关的资料,虽然不敢说把每个细节都完全搞懂了,不过整体思路和关键部分的主要原理还是比较明白.写一篇文章分享给大家.这篇文章的定位会比较科普,尽量用类比的方法将比特币的基本原理讲出来.这篇文章不会涉及算法和协议中比较细节的部分,打算后面会再写一篇程序员视角下的比特币原理,那里会从技术人员的视角对比特币系统中较为关键的数据结构.算法和协议进行一些讲解. 在这篇文章中我会给出一个虚拟的村庄叫"比特村",整个文章会以讲故事的方式

我有几个粽子,和一个故事

前几天,母亲打电话来,说家里包好了一些粽子,要不要给你寄一些去,我愣了愣才感觉到时间真快,转眼间已经快到端午了. 肉粽子是江浙常见小吃.小时候过端午节是一件大事,一家人都会一大早起来忙活包粽子.一大锅粽子煮好后,香气四溢,粽叶的香气飘满整个客厅,鼻子简直享受了一场浓得化不开的芳香盛典.撕开了粽叶,糯米夹杂着粽叶的香气,连着肥肉的香气一口咬下去,所有的香气集中在一起. 到了现在,一个粽子,若说多么好吃,也不见得,家常口味而已.但对于老人来说,端午节是难得的团聚时光.如果你今年又因为种种原因不能回家

创业初期如何做公关,学老罗去讲好一个故事

(文丨舍予兄)前段时间老罗的发布会又一次刷爆了朋友圈,似乎主流媒体都非常乐于看到一个个性狂狷的人开始慢慢收敛,尽管过程中老罗多多少少表现出 不情愿,但大部分人都看的出来,胖子累了.老罗的手机我当然不敢置评,参考王自如,毕竟小命要紧:但是老罗公关方面的可观赏程度还是不错的.所以这篇文 章,不吹不黑,只是单纯地从公关的角度分析,创业者如何像老罗一样,讲好一个引人共鸣的故事. 对于早期创始人来说,公关行为的最高目标就是让用户产生“共鸣”,马云和李彦宏,草根逆袭和技术精英的故事,哪个更吸引人?所以作为一

这个世界上还有一个故事,叫做《大话西游》

这个世界上还有一个故事,叫做<大话西游>. 世界是巨大的枷锁,你不得不重复自己或是别人的生活. 记得长辈说过:年轻是一种罪过.他们说我们不成熟. 真切地为自己的不俗喝彩,在深切的郁闷中,突然就看懂了<大话西游>的开头: 一位才华横溢又无法无天的青年(孙悟空),根本不喜欢世人摊派给他的大事业(西天取经).尤其受不了师父(唐僧)的唠唠叨叨,可世俗条规(观音)又不放过他.为让他悔悟,心甘情愿地去取经,唐僧和观音达成妥协:让他五百年后重新做人. 这真是一个宿命的开始. 九七一师兄曰:&qu