为什么 Nodejs 这么快?
如果对 Node.js 的流行感到震惊,那么并不意外。Node.js 自 2009 年诞生以来就席卷了在线和应用程序开发领域,成为最受欢迎的开发环境。再随着区块链行业的兴起,带来一波开源项目。Node.js 的流行有多种原因,对于初学者来说,它具有庞大的活跃社区和简单的学习曲线。
在本文中,将介绍 Node.js 与 JavaScript 框架的其余部分不同的每个特性,此外,将回顾前五个 Node.js 场景。
是什么让 Node.js 如此之快?
当谈论 Node.js 时,首先想到的是执行速度。因此,在本节中,将尝试弄清楚为什么 Node.js 比其他的更快。首先,理解“执行速度”的含义至关重要。
执行速度可以指从计算斐波那契数列到搜索数据库的任何内容。
Web 服务上下文中的执行速度是指处理请求和产生对客户端的响应所需的一切。它是处理请求所需的时间,从第一个连接开始,到客户端收到响应结束。
看一下有助于弄清楚 Node.js 为何如此之快的几个方面。
Node.js 是单线程和异步的:这意味着所有 I/O 活动都不会妨碍其他进程,还可以同时发送电子邮件、读写文件、查询数据库等等。
对 Web 服务器的每个请求都不会有不同的 Node.js 进程。但是,一个 Node.js 进程会一直运行,监听连接。所有 JavaScript 代码都在进程的主线程中运行,而所有其他 I/O 活动都在不同的线程中运行,几乎没有延迟。
负责执行 JavaScript 的 Node.js (V8) 中的虚拟机使用 JIT 编译。在运行时,虚拟机可以获取源代码并将其编译为机器代码。意味着所有经常使用的“热”函数都可以编译为机器码,从而加快执行速度。
关于异步
借助示例,将尝试掌握异步处理的概念。
假设在山顶,周围有 100 个球。目标是在最短的时间内把所有的球都送到山脚下。显然不能一次按下所有的球,所以必须一次按下一个。此时有两个选择。
在第一种方法中,可以推动一个球,然后等待它到达底部,然后再继续下一个。然而,这种方法需要很长时间才能将所有球推到底部。
在第二种方法中,可以一个一个地推动球,而无需等待它们到达底部。使用这种方法,可以在最短的时间内推动所有 100 个球。
第一种方法是同步执行,而第二种方法在这种情况下是异步执行。前面的示例演示了异步执行比同步操作快得多。
现在算是已经掌握了异步编程的基础知识,再来看看它如何帮助 Web 服务器性能。
假设每个球对应一个数据库查询。因此,如果为一个有很多聚合、搜索等的大型项目以同步方式处理数据,代码执行将被阻塞。
但是,如果异步处理它,可以同时运行所有查询,然后收集结果。
在后端,Node.js 与 Angular、React、React Native 和 Vue.js 相结合,提供闪电般的处理和渲染。
事件循环
事件循环是一种负责在始终与消息发起者异步运行的程序中调度事件的机制。
当使用 Node.js 时,它会在执行 I/O 操作时保留分配给操作的回调,从而允许继续处理其他事件。一旦收集了所有必需的数据,就会调用回调。
Web 服务器将所有请求发送到事件循环,事件循环在线程池中注册操作并为其分配回调。
一旦处理了请求,就会调用回调。其他要求苛刻的活动,例如搜索数据库,可以使用回调来执行。
V8 在优化代码中的作用
V8 由两种类型的编译器组成:
完整的编译器
曲轴编译器
整个编译器以其生成通用代码的速度和能力而著称。它还将 JavaScript 函数的抽象语法树 (AST)转换为通用本机代码。在这个级别,它只执行一个优化:内联缓存。
V8 在代码执行时启动分析器线程并编译函数以确定哪些函数是热的,哪些不是。此外,它还捕获类型反馈,这有助于 V8 记录正在通过它的数据类型。
在识别“热”函数并收集某些类型的反馈信息后,V8 尝试通过优化编译器(有时称为“Crankshaft”编译器)执行增强的 AST。
曲轴编译器速度较慢,但它会努力生成高效的代码。它由两种元素组成:氢和锂。
Hydrogen 编译器的工作是从 AST 文件创建控制流图 (CFG)。结果图显示为静态单一分配 (SSA) 图。
借助 SSA 形式和高级中间表示的简单结构,编译器可以执行许多优化,例如方法内联、常量折叠等。
Lithium 编译器的主要目标是将优化的 HIR 转换为 LIR。LIR 与机器代码非常相似,只是它与平台无关。
之后,旧的、未优化的代码将被替换为已优化的代码。这有助于更快地执行代码。
5 个最佳应用场景
除了速度之外,Node.js 还包括许多开发人员可以在一系列应用程序中使用的功能。来看一下一些顶级的 Node.js 应用场景。
实时应用
当被问及“Node.js 的最佳应用场景是什么?” 实时应用程序就是其最佳解决方案。这是 Node.js 擅长的一个应用程序。为什么 Node.js 在实时应用程序中如此受欢迎:
Node.js 支持重用和共享用于存储库代码的 Node.js 包。
它导致服务器和客户端之间的快速数据同步。
它可以轻松应对多个客户端请求。
总之,如果实时数据处理和可扩展性是项目的两个重要考虑因素,那么 Node.js 是最好的技术。
不仅如此,Node.js 应该用于实时应用程序开发还有许多其他原因。因此,如果有人想知道为什么选择 Node.js 来开发实时应用程序,这就是原因。
基于事件的服务器
在实时应用程序中必须处理多个实时用户。这就是 Node.js 的用武之地,因为它可以处理基于事件驱动服务器的响应,从而实现非阻塞功能。
数据同步
Node.js 开发人员使用非阻塞 I/O 功能。它还允许客户端和服务器之间的快速数据传输。
代理服务器
每当需要中间管理员时,Node.js 是理想的选择。要将 Node.js 用作代理服务器,开发人员必须编写 20 行代码。之后,应用程序将非常适合来自众多来源的流式传输数据。
其他突出的实时应用程序场景
实时应用程序场景的数量是巨大的。因此,解决一些最常见的实时应用程序用例至关重要,包括:
应用监控仪表板
另一个流行的 Node.js 应用程序是跟踪网站访问者并可视化所有实时活动。
可以在此处收集有关用户的实时统计信息,更进一步,在消费者到达渠道中的特定阶段时,只需打开沟通渠道,即可与客户进行有针对性的互动。
这对任何公司都非常有利,因为它可以让他们实时看到他们的消费者或访客在做什么。它还允许他们实时查看他们的交互。这些数据至关重要,企业可以利用它们来改进服务。多亏了 Node.js 的实时和双向套接字,这一切都是可行的。
系统监控仪表板
现在来看看基础设施方面,考虑一个 SaaS 提供商,希望为用户提供一个类似于 GitHub 状态页面的服务监控网站。
Node.js 事件循环允许创建一个强大的基于 Web 的仪表板,可以异步监控服务的状态。在 WebSockets 的支持下,它还向客户端推送数据。
可以使用此技术实时报告公共和内部服务的状态。
考虑金融机构、电信运营商或云/网络/托管提供商的网络运营中心 (NOC) 监控应用程序,所有这些应用程序都运行在使用 WebSockets 和 Node.js 而不是 Java 或 Java Applet 的开放 Web 堆栈上.
视频流
流式传输是以小批量而不是大批量发送大量数据的过程。对于设计视频流应用程序,Node.js 是一个很好的选择。这是理想的,因为它带有内置的视频流模块。
它还允许创建可写入和可读取的数据流。您还可以在使用 Node.js 上传文件时对其进行处理。
Node.js 也被 Netflix 使用,它是世界上最大的流媒体服务,业务遍及 190 多个国家/地区。
为什么 Netflix 选择 Node.js?
Netflix 的整个用户界面都建立在 Node.js 技术之上。Netflix 很快选择在其他几个堆栈层上使用它,因为它非常有效。
Netflix 的开发团队采用 Node.js 的主要目标是创建一个可以渲染高性能的轻量级软件。新的基于节点的应用程序将加载过程加快了 70%
。除此之外,它还导致了以下结果:
提高性能
减少构建时间
启用用户自定义
高度可扩展的应用程序
Node.js 已成为用户群稳步增长的所有应用程序和平台的首选平台。沃尔玛、贝宝、优步、Netflix、LinkedIn 等公司都在使用 Node.js,因为它允许无缝扩展。
Node.js 的尖端技术包括集群模块等功能。它提供跨多个 CPU 内核的负载平衡,从而更容易通过更小的模块提供所需的结果,而不会耗尽 RAM。
不仅如此,Node.js 还有一个非阻塞事件循环系统,允许服务器实时处理请求。
在开发方面,Node.js 允许使用微服务,这进一步允许将应用程序分解为更小的组件。
通过在不同团队之间有效地定义和分配任务,可以加速应用程序每个组件的开发、部署和维护。
有了 Node.js,现代应用程序可以根据需要进行扩展和缩减。它还可以帮助企业以更少的资源实现更高的绩效。
在线聊天
聊天应用程序是实时和多用户应用程序的最常见场景。因为它是跨多个分散设备运行的数据密集型、高流量和轻量级应用程序,所以聊天应用程序是 Node.js 的最大场景之一。
它在实践中是如何工作的。
考虑以下场景:网站上有一个单独的聊天室,个人可以来这里交换消息。假设网站上有三个人可以访问留言板。
在这种情况下,服务器端 Express.js
应用程序将实现以下两个功能:
为网页提供服务的请求处理程序
GET /
由消息板和初始化新消息输入的“发送”按钮组成WebSockets 服务器侦听 WebSocket 客户端发出的所有新消息。
在客户端,我们有一个 HTML 页面,其中设置了一些处理程序。其中之一是“发送”按钮单击事件,它负责获取输入消息并将其发送到 WebSocket。另一个用于侦听发送到 WebSocket 客户端的新传入消息。
总结
凭借其闪电般的执行速度,Node.js 已被证明是许多开发人员和企业的救星,许多大公司都利用了 Node.js 的这一特性。
版权声明: 本文为 InfoQ 作者【devpoint】的原创文章。
原文链接:【http://xie.infoq.cn/article/f7ad3dcfc3b35d3066178b362】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论