Node初衷是基于事件驱动、非阻塞I/O的Web服务器。其初始人Ryan Dahl资深C/C++程序员,Node发展为强制不共享任何资源的单线程、单进程系统,构建快速、可伸缩的网络应用平台。
node-webkit项目将node中的事件循环和Webkit的事件循环融合。
Node的系统结构如图所示,采用性能高的V8引擎作为支撑,对不同系统抽象出中间层libuv,实现高性能的异步I/O访问。
Node特点
(1) 异步I/O
Node中绝大多数的操作都是异步调用,通过底层构建很多异步I/O的API,从文件读取到网络请求。
(2) 事件与回调函数
事件的编程方式具有轻量级、松耦合、值关注事务点等优势。
(3) 单线程
不用处理多线程的同步问题,也不会存在死锁。缺点主要有以下:
a.无法利用多核CPU
b.错误会引起整个应用退出
c.大量计算占用CPU导致无法继续后面异步调用I/O
浏览器中JavaScript和UI共用一个线程,JS的长期执行会导致UI渲染的中断。
最早解决大量计算问题,Google的Gears,通过启动一个完全独立的进程,将需要计算的程序发给这个进程,计算结果通过事件传递回来。HTML5制定了Web Workers创建工作线程来计算,为了不阻塞主线程,通过消息传递方式来传递运行结果。
Node中采用和Web Work是类似的思路来解决单线程中大量计算问题:child_process
(4) 跨平台
Windows和*nix平台
Node的应用场景
(1) I/O密集型
充分利用Node的事件循环的处理能力,而不是启动每一个线程为每个请求服务,这样占用资源极少。
(2)CPU密集型
a. Node通过编写C/C++扩展的方式更高效利用CPU
b.利用子进程方式充分利用CPU
(3) 分布式应用
(4) Node使用者
a. 前后端编程语言环境统一
b. Node带来的高性能I/O用于实时应用
c. 并行I/O更高效利用分布式环境
d. 并行I/O,有效利用稳定接口提升Web渲染能力