你真的了解 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和事件驱动

在 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

适合场景

上文提到,Node.js 是单线程、使用非阻塞 I/O 调用,这允许它支持数以万计的并发支持(在事件循环中维持)。也就是说,它是 I/O 密集型非常不错的选择。比如聊天室。

不适合场景

当涉及到繁重的计算时,Node.js 并不是最好的平台。因为 Node.js 是单线程的,单线程存在以下弊端:

  • 无法利用多核 CPU
  • 错误会导致整个应用退出,应用健壮性值得考虑
  • 大量计算占用 CPU 无法继续调用异步 I/O

当然,Node.js 也提出了相关的解决方案,比如 child_process 和 cluster。可以利用子进程承担繁重的计算任务,然后通过进程消息来传递消息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值