Node简介
1.Node的诞生历程
Node诞生于2009年3月。
2.Node的命名与起源
Node的别名:Nodejs、NodeJS、Node.js。
2.1为什么是JavaScript
设计高性能Web服务器的几个要点:事件驱动、非阻塞I/O。
考虑到高性能、符合事件驱动、没有历史包袱这三个主要原因,JavaScript成为了Node的实现语言。
2.2为什么叫Node
Node可以构建服务器、客户端、命令行工具,Node发展为一个强制不共享任何资源的单线程、单进程系统,其目的是成为一个构建快速、可伸缩的网络应用平台。
Node自身非常简单,通过通信协议来组织许多Node,非常容易通过扩展来达到构建大型网络应用的目的。
每一个Node进程都构建成这个网络应用的一个节点,这是它名字所含意义的真谛。
3.Node给JavaScript带来的意义
Node打破了过去JavaScript只能在浏览器运行的局面,前后端编程环境统一,可大大减少前后端转换所需要的上下文交换代价。
4.Node的特点
作为后端JavaScript运行的平台,Node保留前端浏览器JavaScript中那些熟悉的接口,没有改变语言的任何特性,依旧依赖作用域和原型链,区别在于它将前端中广泛运用的思想迁移到服务端。
4.1异步I/O
异步调用中对于结果值的捕获是符合"Don't call me, I will call you"原则。
在Node中,绝大多数的操作都以异步的方式进行调用。
4.2事件与回调函数
事件的编程方式具有轻量级、松耦合、只关注事务点等优势。
回调函数无处不在,在JavaScript中,函数作为一等公民,可以将函数作为对象传递给方法作为实参进行调用。
4.3单线程
在Node中,JavaScript与其他线程无法共享任何状态。
单线程的优点:
- 不用像多进程编程那样处处在意状态的同步问题;
- 没有死锁;
- 没有线程上线文交换所带来的的性能的开销;
单线程的缺点:
- 无法利用多核CPU;
- 错误会引起整个应用退出,应用的健壮性值得考验;
- 大量计算占用CPU导致无法继续调用异步I/O;
Web Works能够创建工作线程来进行计算,以解决JavaScript大计算阻塞UI渲染的问题。
工作线程为了不阻塞主线程,通过消息传递的方式来传递运行结果,这也使得工作线程不能访问到主线程中的UI。
Node解决单线程中大计算量的方式:child_process(子线程)。
子进程:通过计算分发到各个子进程,可以将大量计算分解掉,然后通过进程之间的事件消息来传递结果,这可以很好地保持应用模型的简单和低依赖。
4.4跨平台
Node可以在Windows和*nix平台运行,得益于在操作系统与Node上层模块系统之间构建一层平台层架构,即libux。
5.Node的应用场景
Node的应用场景主要分为I/O密集型和CPU密集型。
5.1I/O密集型
Node面向网络且擅长并行I/O,能够有效地组织起更多的硬件资源,从而提供更多更好的服务。
I/O密集型的优势:
利用事件循坏的处理能力,而不是启动每一个线程为每一个请求服务,资源占有极少。
5.2是否不擅长CPU密集型业务
Node优秀的运算能力主要来自V8的深度性能优化。
CPU密集型应用给Node带来的挑战:
由于JavaScript单线程的原因,如果长时间运行的计算(如大循环),将导致CPU时间片不能释放,使得后续I/O无法发起。但是适当调整和分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起,这样既可以同时受到并行异步I/O的好处,又能充分利用CPU。
Node充分利用CPU的方式:
- 通过编写C/C++扩展的方式高效的利用CPU,将一些V8不能做到性能极致的地方通过C/C++来实现;
- 通过子进程的方式,利用进程间的消息传递结果,将计算和I/O分离;
CPU密集不可怕,如何合理调度是诀窍。
5.3与遗留系统和平共处
旧系统具有非常稳定的数据输出,持续为传统网站服务,同时为移动版提供数据源,Node将该数据源当做数据接口,发挥异步并行的优势。
5.4分布式应用
阿里巴巴的数据平台。
5.5Node的使用者
Node的使用者:
- 前后端编程环境统一;(雅虎)
- Node带来的高性能I/O用于实时应用;(腾讯,花瓣网,蘑菇街)
- 并行I/O使得使用者可以更高效地利用分布式环境;(阿里巴巴,eBay)
- 并行I/O,有效利用稳定接口提升Web渲染能力;(雪球财经,LinkedIn)
- 云计算平台提供Node支持;(微软,阿里云,百度云)
- 游戏开发领域;(网易)
- 工具类应用;
网友评论