在前几天,偶然的时间里,偶然的机遇下,看到了Node.js,发现很火,所以就简单了解了下,还有待更进一步了解。这里先把初步了解的一些信息做下整理。
1、 Node.js是什么?
简单说,就是可以让JS脚步能够跑在服务器后端上的一个程序。
2、 Node.js最大优势是什么?
可以利用你原有对JS脚步的知识进行服务器后端开发,虽然说学习一个新的编程语言对很多人来说问题不大,但如果要用好一个语言,可能就要花些时间了。
提供了IO的异步操作模式。
3、 Node.js怎么就提升了吞吐量?
我们先提供两个基本的结论,第一个是,将服务器的资源分为两个部分,计算资源和IO资源,一般来说,一个服务请求中,计算资源占用的时间是远远小于IO资源的时间的;第二个是,如果存在一种机制或算法可以使得服务器的计算资源,IO资源一直处于满负荷运行状态(当然是因为处理请求),那么这种机制一定是最高效的压榨服务器资源的机制或算法,其实很多网络服务器程序(机制)都是围绕这两个结论来优化。
那么,现在来看Node.js为什么会高效?说一个东西好,必然是因为存在对比,如果没有对比,也就无所谓好了。那么我们这里的对比参照物是什么?是我们一般经常用的方案,就是对每个请求启动一个处理进程或线程,该进程同步的处理该请求。
现在,我们来假设一个例子,假设有四个请求达到,每个请求需要的计算资源为1s,IO资源时间为9s,并且服务器支持同时分配两个计算资源(双核),两个IO资源(假设),那么,我们对比参照模式下,需要的时间计算非常简单,就是,10s+10s=20s,前10s并行的处理了两个任务,后10s又并行的处理了两个任务。
分析,当前10s在处理前两个请求时,有个很严重的问题,在进行IO资源占用时,计算资源被闲置了,这是让我们相当心痛的浪费啊。
关键之处来了,Node.js是如何处理呢,首先需要说明下Node.js是单进程,单线程,单IO处理时多线程,所以它的执行过程中计算只有一个请求被计算,可以有多个请求进行IO资源的占用处理,这样Node.js处理上边假设的四个请求时,时间计算就复杂了很多,结果如下:第一个请求计算时间+第一个请求IO时间(包含第二三四个请求的计算时间,以及第二个请求IO时间的8s)+第三个请求IO时间(包含第2个请求IO时间的1s,第四个请求IO时间的8s)+第四个请求IO时间的3s=1+9+9+1=20
从简单的总时间上来说,时间是一样的,很多人就会疑惑这个例子真的是说明Node.js是更加高效的吗?
当然了,为什么?因为我们从计算过程中就可以看到,在前4s内,我们已经将说还有的请求计算任务完成了,这意味着如果后续的16s内再有任务到来,它的计算时间是可以忽略不计的了,这个如果还有不理解的,可以留言。
4、 Node.js为什么采用的是单进程、但线程?
这个问题的答案其实在第三个问题中已经说明了,本质原因是有网络请求的特性来决定的,那就是计算时间与IO时间的比例,即使是单线程也是足够应用了,但如果说Node.js的目标变大了,不满足于单独这类应用了,很多高计算资源占用类程序也希望能够涉足,那么那一天就是支持多进程或多线程的时候了,就目前看似乎没有这个迹象。