NIO中的易筋经
匠心零度 转载请注明原创出处,谢谢!
前言
《易筋经》。天下武功出少林,而易筋经是少林寺的镇寺之宝。学好了易筋经就可以轻易地学好其它武功,只不过很少人学到了它的全部精髓。游坦之只是碰巧学了一点点就变成了武林高手,从中可以看出易筋经的威力的确很大。
之前以及写过三篇NIO文章,NIO相关基础篇一、NIO相关基础篇二、NIO相关基础篇三,今天我们来提下NIO中的易筋经Reactor模型。
说明
不会说故事的程序员不是好厨子,下面就来听听故事吧。
故事改编与网络。
以A地公众号:匠心零度菜馆为例,以客人就餐为例。
我们服务对象以桌(一桌>=1)为最小单位
故事一:
公众号:匠心零度菜馆刚刚成立,客人还不是特别多的时候。
来一桌客人就餐,一个服务员去服务,然后客人会看菜单,点菜。 服务员将菜单给后厨。
来二桌客人就餐,二个服务员去服务……
……
来五桌客人就餐,五个服务员去服务……
公众号:匠心零度菜馆越来越忙,人越来越多,零度老板开始着急了:
缺乏弹性伸缩能力,当顾客越来越多,并行增加之后,服务员与顾客人数关系1:1关系。
现在人员太贵,再请人就攒不到钱了,当顾客到达一定之后零度就承担不了聘用那么的工作人员了,要不然公众号:匠心零度菜馆会垮掉了。
零度思来想去:
算了下成本,零度决定只聘用十个服务员。
这样当顾客越来越多,并行增加之后,服务员与顾客人数关系10:N(N大于等于10)关系。
这样公众号:匠心零度菜馆也不会因为聘用人员太多而承担不起。
那么又有什么问题呢? 如果某桌客人点菜非常慢,导致有些桌客人会一直等很久,当体验不好的时候可能
有些桌的可以立马走了,有些桌的客人以后不来了。
虽然钱省下来了,但是也没有挣到,零度又开始想办法了,看看下面的故事二吧。
故事二:
哈哈哈哈,零度之前是干编程的,知道很多事情需要拆拆拆(特别在中国要是拆房子,那不得了啊,发啦!!!)
上面的事情由于所有的事情都是一个服务器从头负责到尾,而有很多时候,顾客在交流讨论的时候,服务员其实
没啥事情干的,就在那里等着(能不能让等的时候去做其他事情呢,充分利用起来呢???)。
零度思来想去:
终于发现了一个新的方法,那就是:
当客人点菜的时候,服务员就可以去招呼其他客人了,等客人点好了菜,直接招呼一声"服务员",
马上就有个服务员过去服务。之后零度进行了一次裁员,只留了一个服务员!
这样公众号:匠心零度菜馆生意越来越好,又出现了二个问题:
就算该服务员在怎么忙,也无法应对成百上千桌的客人了。
一个服务员如果请假或者有事情怎么办?(经常说服务不要出现单点,这样也一样啊!!!)
虽然钱省下来了,但是该挣的钱没有挣到,零度又开始想办法了,看看下面的故事三吧。
故事三:
零度决定公众号:匠心零度菜馆再聘二名服务员,现在有三名服务员了,零度给他们划分是
一个负责填写各各桌的菜单,另外二名负责端菜(上菜的忙些),接下来的生意都很好,也忙的过来,请假了,另外二个相互配合下
临时处理也来得及,由于这样,生意越来越好,有一次被不三不四的人进来了,搞的公众号:匠心零度菜馆事情很大。
如果服务员还要检查人员,那么又忙不开了。
零度又开始思考了,看看下面的故事四吧。
故事四:
零度聘了一个保安,需要检查下是否为不三不四人员,如果不是,把他交给服务员让服务员带入,之后服务员带入
继续由客人直接招呼一声"服务员"点菜好了,之后由其他服务员端菜……生意很好。
已经到了一个公众号:匠心零度菜馆忙不过来了 (到达上限了,那么要扩了,开分店……)
故事N:
零度,反正以前干编程的,自己开发了一个app,客人过来之前就已经网上下单,零度专门找了一个人负责这块,当app有
新订单的时候会有声音提醒,那个负责人告诉后厨,这样当没有提醒的时候,该负责人可以去帮忙照顾店里的客人……
编不下去了…………
Reactor模型介绍
本文最重要的参考文献是Doug Lea大神的"Scalable IO in Java”,搜索公众号【匠心零度】或者扫描最下方二维码进行关注,回复:nio ,获取该资料,建议电脑下载,下文中的截图也是截取自中。
传统的BIO编程、伪异步I/O编程
BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程来处理这条链路,在需要满足高性能、高并发的场景是没法应用的(大量创建新的线程会严重影响服务器性能,使用线程池也是存在问题,如果发生大量并发请求,超过最大数量的线程就只能等待,会一直阻塞)
单线程模型
单线程模型会存在如果链接太多,性能可能无法满足,而且如果nio线程出现意外啥的会影响这个系统不可用。
多线程模型
多线程模型一般场景都满足了,但是在特别高的并发,以及一些非常消耗性能的验证等,会存在一些不足之处。
主从多线程模型
主从多线程模型,通过mainReactor线程、subReactor线程继续拆分,mainReactor线程负责一些客户端TCP连接请求预处理(验证等),subReactor线程处理真正的IO。
参考:
http://daimojingdeyu.iteye.com/blog/828696
结束语
本人水平有限,难免会有一些理解偏差的地方,如果发现,欢迎各位积极指出,感谢!!!
如果读完觉得有收获的话,欢迎点赞、关注、加公众号【匠心零度】,查阅更多精彩历史!!!
NIO中的易筋经的更多相关文章
- JAVA NIO中的Channels和Buffers
前言 Channels和Buffers是JAVA NIO里面比较重要的两个概念,NIO正是基于Channels和Buffers进行数据操作,且数据总是从Channels读取到Buffers,或者从Bu ...
- NIO中Selector分析
NIO中,使用Selector.select()方法来侦听是否有数据可以读/写,服务端开始执行时,如果没有客户端,这里的语句将进行阻塞,等待下面三个情况出现,才会进行后续的方法之行,这里是重点 ...
- Java NIO中核心组成和IO区别
1.Java NIO核心组件 Java NIO中有很多类和组件,包括Channel,Buffer 和 Selector 构成了核心的API.其它组件如Pipe和FileLock是与三个核心组件共同使用 ...
- Java NIO中的Buffer 详解
Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...
- Java NIO中的缓冲区Buffer(一)缓冲区基础
什么是缓冲区(Buffer) 定义 简单地说就是一块存储区域,哈哈哈,可能太简单了,或者可以换种说法,从代码的角度来讲(可以查看JDK中Buffer.ByteBuffer.DoubleBuffer等的 ...
- NIO 中的读和写
概述 读和写是I/O的基本过程.从一个通道中读取很简单:只需创建一个缓冲区,然后让通道将数据读到这个缓冲区中.写入也相当简单:创建一个缓冲区,用数据填充它,然后让通道用这些数据来执行写入操作. 从文件 ...
- NIO中的heap Buffer和direct Buffer区别
在Java的NIO中,我们一般采用ByteBuffer缓冲区来传输数据,一般情况下我们创建Buffer对象是通过ByteBuffer的两个静态方法: ByteBuffer.allocate(int c ...
- java NIO中的buffer和channel
缓冲区(Buffer):一,在 Java NIO 中负责数据的存取.缓冲区就是数组.用于存储不同数据类型的数据 根据数据类型不同(boolean 除外),提供了相应类型的缓冲区:ByteBufferC ...
- epoll浅析以及nio中的Selector
出处: https://my.oschina.net/hosee/blog/730598 首先介绍下epoll的基本原理,网上有很多版本,这里选择一个个人觉得相对清晰的讲解(详情见reference) ...
随机推荐
- UWP 判断系统版本
public class VersionsHelper { , ); , ); , ); , ); , ); }
- Hashtable 小记
Hashtable 是 JDK 中较早的数据结构了,目前已不再推荐使用了.但抱着学习的目的,还是看了下它的实现. 简介 Hashtable,顾名思义即哈希表,是一种经典的数据结构.其基本结构是一个数组 ...
- Python爬虫(十二)_XPath与lxml类库
Python学习指南 有同学说,我正则用的不好,处理HTML文档很累,有没有其他的方法? 有!那就是XPath,我们可以用先将HTML文档转换成XML文档,然后用XPath查找HTML节点或元素. 什 ...
- Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)
Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效) 前言 今天在使用Spring cache的Cacheable注解的过程中遇见了一个Cacheable注解失效的问题, ...
- 不同ios系统下mainscreen的applicationFrame和bounds值測试
打印结果(横屏,3.5寸.若4寸则最后一项对应添加) ios6: 2014-04-26 10:57:12.300 testAccount[18525:907] applicationFrame: {{ ...
- 海尔U+的启发:让用户对智能家居拥有“话语权”
近年来,智能家居成了IT产业的重要话题,随着智能家电一系列产品的出现,智能家居最终開始从概念走向落地.只是,眼下智能家居行业有个非常突出的问题------因为缺乏开放的意识,不管是产品还是理念 ...
- SSH Secure Shell显示serverTomcat后台内容
作为linux小白,仅仅有学一点记一点了: 部署server的时候.常常须要向本地一样查看控制台输出,在linux上能够通过查看日志输出替代,当然也能够通过命令让日志实时显示在命令窗体,这对用惯了wi ...
- 入门vue----(介绍)
声明式渲染 Vue.js 的核心是一个允许采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统: <div id="app"> {{ message }} < ...
- 秦俊:开放 DevOps 敏捷开发套件,助力开发者驰骋云端
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ DevOps可以让人工智能(AI).大数据(Bigdata).云计算(Cloud)更加高效地落地,越来越多的企业和团队在践行DevOps. ...
- 基于.NET的弹性及瞬间错误处理库Polly
本文基本是官方说明的翻译和总结(https://github.com/App-vNext/Polly) 什么是Polly? Polly是一款基于.NET的弹性及瞬间错误处理库, 它允许开发人员以顺畅及 ...