如题,进入新公司后,才真正接触到Nodejs的开发。虽然之前了解过很多,却一直犹如未见面的新娘,“犹抱琵琶半遮面”,不知庐山真面目。真正接触之后,发现对Node一发不可收拾,深深的迷恋。

开篇是为了记录下自己对Node的学习过程,供大家分享。

1. Node的特点

1.1 异步IO

异步调用是注重结果、不关心过程的一种表现。符合“Don't call me,I will call you"的原则的。

在Node中,绝大多数的操作都是异步的方式进行调用。

var fs = require('fs');

fs.readFile('/path',function(err,file){
    cosole.log('读取文件完成');
}console.log('发起读取文件');

1.2 事件与回调函数

Node将前端浏览器中应用广泛且成熟的事件引入后端,配合异步I/O,将事件点暴露给业务逻辑。

1.3 单线程

Node保持了Javascript在浏览器中单线程的特点。单线程的好处是不用像多线程编程那样处处在意状态的同步问题,没有死锁,也没有线程上下文交换所带来的性能上的开销。

当然,单线程也存在一些弱点,总结如下:

  • [ ] 无法利用多核CPU;

  • [ ] 错误会引起整个应用退出,应用的健壮性值得考验;

  • [ ] 大量计算占用CPU导致无法继续调用异步I/O;

Node采用了与Web Workers相同的思路来解决单线程中大量计算量的问题:child_process. 子进程的出现,意味着Node可以从容应对单线程在健壮性和无法利用多核CPU方面的问题。通过将计算分发到各个子进程,可以将大量计算分解掉,然后再通过进程之间的事件消息来传递消息,这可以很好的保持应用模型的简单和低依赖,通过Master-Worker的管理方式,也可以很好的管理各个工作进程,以达到更高的健壮性。

1.4 跨平台

兼容windows和*nix;

1.5 Node的应用场景

1.5.1 I/O密集型

Node面向网络且擅长并行I/O,能够有效的组织起更多的硬件资源,从而提供更好的服务。

I/O密集的优势主要在于Node利用事件循环的处理能力,而不是启动每一个线程为每一个请求服务,资源占用极少。

1.5.2 CPU密集型业务

Node在性能上表现不俗。CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间将运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起。

关于CPU密集型应用,Node的异步I/O已经解决了在单线程上CPU与I/O之间阻塞无法重叠利用的问题,I/O阻塞造成的性能浪费远比CPU的影响小。