《深浅》中提到了四个node.js的特点:异步I/O,事件与回调函数,单线程以及跨平台。
《高级》中基本是一笔带过,提到了纯事件驱动以及非阻塞。
其中对于异步I/O以及单线程这两个特性,我认为可以分以下三个方向来概述为什么node.js把天赋点在了这它们上面?
1. 用户体验
从前端加载的角度来看,比较直接。先说为什么JavaScript用异步?!我们反着思考,如果JavaScript是同步的,会有什么问题。请求一个用户管理页面,用js加载若干资源,先加载一个用户头像,再加载第二个,第三个。。。GG,用户以为卡死了,二话不说给你关了(《深浅》中提到脚本时间超过100毫秒,用户就会有卡顿的感觉;而且运行在单线程上的JavaScript还与UI渲染公用一个进程)。实际中,JavaScript的异步消除/减弱了UI阻塞的现象,同步时候加载资源的总时间是X+Y+Z,异步下的总时间则是max(X+Y+Z),可见差距。另外《深浅》中来提到目前网络发展,分布式应用普及,前面XYZ的数值在增长,那么可以想象到X+Y+Z和max(X+Y+Z)的差距肯定越来越大。由此可以看出异步大法好,大家都说屌!那么node.js选择异步I/O也就顺理成章,从后端做到异步,提升资源响应速度,那么随之前端的用户体验也就会更好!
2. 系统资源
因此,node.js的解决方案是:利用单线程,远离多线程死锁、状态同步等问题;利用异步I/O,让单线程远离阻塞,以更好地使用CPU。(《深浅》原句)
3. 应用场景
---------------------------------------------------------------------
下面是另外几点令我印象深刻的地方:
- 《深浅》还提到:为了提升性能增加进程数量,这种方法是无法提升资源利用率。他用到了『加三倍服务器』的例子,下面是我从豆瓣上找到的一个解释:(加三倍服务器是否能提升性能)要看系统本身的架构,不一定增加三倍服务器就能档得住三倍的用户一起来点的。因为服务器增多之后,其间通信的成本也增加了,而且如果存在中心节点,那么那几个节点还是会变成瓶颈。跟高速公路堵车对比,加服务器并不是“四车道变八车道”那么简单,很可能多修几条路以后1)十字路口也变多了2)支路多了以后主干道堵得更厉害。”
-
如果深究异步I/O这个东西,《深浅》第三章做了更加细致的讲解,涉及到了异步的几种实现方式,以及Node是怎么实现异步I/O的。原来之前说的异步,是理想的非阻塞异步I/O:
(出自《深入浅出node.js》)
(出自《深入浅出node.js》)
- node.js既然有异步I/O的特点,是不是就可以肆意妄为了,只要异步就一定非阻塞呢?答案肯定是不啊(考这么多年试:像这种极端的问题,答案肯定是否定的)。如果我们在主线程做过多的任务,或者很多计算密集型任务,那么可能会导致主线程的卡死,影响整个程序的性能,这不就阻塞你异步的脚步了。
作者:macctown
链接:https://juejin.im/post/5a0a591e6fb9a0451704b55e
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。