《深入浅出Node.js》学习笔记(一)

1,399 阅读5分钟

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与其他线程无法共享任何状态。

单线程的优点:

  1. 不用像多进程编程那样处处在意状态的同步问题;
  2. 没有死锁;
  3. 没有线程上下文交换所带来的的性能的开销;

单线程的缺点:

  1. 无法利用多核CPU;
  2. 错误会引起整个应用退出,应用的健壮性值得考验;
  3. 大量计算占用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的方式:

  1. 通过编写C/C++扩展的方式高效的利用CPU,将一些V8不能做到性能极致的地方通过C/C++来实现;
  2. 通过子进程的方式,利用进程间的消息传递结果,将计算和I/O分离;

CPU密集不可怕,如何合理调度是诀窍。

5.3与遗留系统和平共处

旧系统具有非常稳定的数据输出,持续为传统网站服务,同时为移动版提供数据源,Node将该数据源当做数据接口,发挥异步并行的优势。

5.4分布式应用

阿里巴巴的数据平台。

5.5Node的使用者

Node的使用者:

  1. 前后端编程环境统一;(雅虎)
  2. Node带来的高性能I/O用于实时应用;(腾讯,花瓣网,蘑菇街)
  3. 并行I/O使得使用者可以更高效地利用分布式环境;(阿里巴巴,eBay)
  4. 并行I/O,有效利用稳定接口提升Web渲染能力;(雪球财经,LinkedIn)
  5. 云计算平台提供Node支持;(微软,阿里云,百度云)
  6. 游戏开发领域;(网易)
  7. 工具类应用;