最近笔者在阅读《深入浅出Node.js》,结合查阅的相关资料,本文算是一篇 Node.js 笔记。
Node.js 是基于 Chrome V8 引擎的 JavaScript 运行时环境。
在 Node.js 出现之前,JavaScript 只能在浏览器中使用。而 Node.js 的出现打破了这个局面。以下为 Chrome 浏览器和 Node.js 的组件构成。
在 Node.js 中不需要处理 UI,所以不需要关注 webkit 引擎、HTML、显卡等 UI 技术,从而能够更加“放手大胆”去做。它使用了 Google V8 引擎,V8 引擎是采用 C++ 书写的,将 JavaScript 代码编译成机器码。Node.js 采用了 V8 引擎,并且在其基础上增加了处理本地文件等功能。但在浏览器中,出于安全考虑,你是无法访问浏览器的文件系统的。所以你可以理解 Node 中的 V8 引擎是增强后的版本。浏览器和 Node.js 的结构是相似的,比如它们都是通过事件驱动的异步架构,浏览器通过事件驱动来完成界面 UI 交互,Node.js 通过事件驱动完成服务 I/O。
通过 Node.js,JavaScript 不仅仅可以写在浏览器端,我们可以在我们的电脑中直接执行 JavaScript,也是完成 web 服务应用的非常好的选择,这降低了我们成为全栈工程师的门槛。
在 Node.js 中,大部分的 I/O 操作都是异步,非阻塞的。也就是不需要等待该操作完成,就可以接着进行下一步的操作。这样做的目标当然就是为了并行进行 I/O 操作,从而提升效率。
既然是异步 I/O,那什么时候去指定这个任务呢?跟浏览器一样,Node.js 也有一套事件循环的机制。Node.js 开始启动进程的时候,Node.js 会创建一个循环,每次循环运行就是一个 Tick 周期,每个 Tick 周期中会从事件队列查看是否有事件需要处理,如果有就取出事件并执行相关的回调函数。
在 Java、PHP 或者 .net 等服务器端语言中,会为每一个客户端连接创建一个新的线程。而每个线程需要耗费大约 2MB 内存。也就是说,理论上,一个8GB内存的服务器可以同时连接的最大用户数为4000个左右(8000 / 2),这还没有算上线程之间的上下文切换的成本。要让 Web 应用程序支持更多的用户,就需要增加服务器的数量,而 Web 应用程序的硬件成本当然就上升了。
但 Node.js 不为每个客户连接创建一个新的线程,而仅仅使用一个线程。
注意,Node.js 所谓的单线程,只是主线程是单线程,所有的网络请求或者异步任务都交给了内部的线程池去实现,本身只负责不断的往返调度,由事件循环不断驱动事件执行。
也就是说,这个单线程指的是 JavaScript 的单线程,Node 自身其实是多线程的。也就是说除了用户代码无法并行执行之外,所有的 I/O (磁盘I/O,网络 I/O 等)则是可以并行起来的。这也是 Node.js 能够处理高并发的重要原因。在 Node.js 中,一个 8GB 内存的服务器,可以同时处理超过 4 万用户的连接。
单线程其实是有弊端的(后文适合场景中会指出)。
起初,Node.js 只能在 Linux 平台上运行。后来随着 Node.js 的发展,微软注意到了它的存在,并投入了一个团队帮助 Node 实现 Windows 平台的兼容,在 v0.6.0 版本发布时,Node 已经能够直接在 Window 平台运行了。Node 是基于 libuv 实现跨平台的,它处于操作系统与 Node.js 上层模块之间。libuv 也是很多系统实现跨平台的基础组件。
上文提到,Node.js 是单线程、使用非阻塞 I/O 调用,这允许它支持数以万计的并发支持(在事件循环中维持)。也就是说,它是 I/O 密集型非常不错的选择。比如聊天室。
当涉及到繁重的计算时,Node.js 并不是最好的平台。因为 Node.js 是单线程的,单线程存在以下弊端:
当然,Node.js 也提出了相关的解决方案,比如 child_process 和 cluster。可以利用子进程承担繁重的计算任务,然后通过进程消息来传递消息。
[1]深入浅出Node.js: https://m.douban.com/book/subject/25768396/
[2]https://m.douban.com/book/subject/25768396/: https://dev.to/aviyel/node-js-from-beginners-to-advance-31id
[3]你了解Node.js的原理和应用场景吗?: https://cloud.tencent.com/developer/article/1448042
[4]来,告诉你Node.js究竟是什么?: https://segmentfault.com/a/1190000019854308#item-4