如题,进入新公司后,才真正接触到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的影响小。