什么项目需要使用Node.js

  |   0 评论   |   0 浏览   |   给我丶鼓励

作为最常用的编程语言,JavaScript 目前正处于其普及的顶峰。能够在服务器端和客户端使用 JavaScript 的奢侈之处是这种流行的原因之一。

现在,Node.js(服务器端 JavaScript 运行时)在开发人员中非常流行,这不仅是因为易于在前端和后端使用相同的语言。与其他编程语言相比,Node.js 带来的好处是开发人员蜂拥使用该语言的主要原因。但是对 Node.js 也有很多批评。当然,批评并非没有根据。但是,重要的是要了解该语言的功能使其更适合于某些任务,而不是某些其他任务的理想选择。

您应该问的最终问题是何时使用 Node.js,何时不使用 Node.js。本文的目的是为该问题提供答案。

要了解何时以及何时不使用 Node,我们必须了解语言的基本机制和功能。Node.js 是单线程,事件驱动和异步的。这些话可能对您现在意义不大。因此,让我们研究一下这些功能对于 Node.js 的工作意义。

事件驱动

事件是 Node.js 架构的核心。它使用事件循环来侦听事件并将其传递给事件处理程序。例如,假设您正在从 Web 浏览器向 Node.js 服务器发送请求。这将触发服务器中的事件循环,以侦听 HTTP 请求。然后,事件循环调用关联的回调函数来处理发出的事件。在第一个事件处理程序执行结束时,它再次发出另一个事件,以将其传递给下一个事件处理程序。该过程将一直持续到任务完成为止。Node.js 的大多数模块都实现了一个事件循环,该事件循环在一个循环中侦听和响应事件。Node.js 按事件到达事件侦听器的顺序接受事件。收到的最后一个事件将添加到事件队列的末尾,并在前面的事件完成之后执行。

单线程

Node 的事件循环在处理事件时使用单线程实现。每个事件由单个处理器线程按到达顺序依次处理。接收到节点 Web 服务器的请求按接收顺序进行服务。

要了解单线程实现的重要性,您必须了解多线程实现的工作方式。

多线程程序具有并发运行以接受请求的线程池。程序使用的线程数受系统的 RAM 或其他参数限制。因此,它在给定时间可以处理的请求数仅限于此线程数。而单线程 Node.js 程序可以在给定时间处理要执行的事件队列中的任意数量的请求。

Node.JS 与传统

Node 的单线程性质使程序具有高度可伸缩性。您可以使用用于处理有限数量的请求的同一程序来处理大量的请求。扩展多线程应用程序需要更多的系统资源(例如 RAM),以增加线程池中的线程数。

但是,Node.js 具有单线程的缺点。单线程实现使 Node 成为 CPU 密集型程序的错误选择。当程序中运行耗时的任务时,它将阻止事件循环继续前进更长的时间。与多线程程序不同,在多线程程序中,一个线程可以执行 CPU 密集型任务,而其他线程可以处理到达的请求,而 Node.js 程序则必须等到计算完成以处理传入的请求。

Node.js 在版本 10.5.0 中引入了针对此问题的解决方法:工作线程。您可以阅读有关此主题的更多信息,以了解如何使用辅助线程来解决 CPU 密集型程序的此问题。

异步/非阻塞

您现在可能有问题吗?如果事件是一个接一个而不是同时处理的,那么在给定的时间,单个线程如何处理比线程池更多的事件?这是 Node 的异步模型介入的地方。即使 Node 的事件循环实现是单线程的,它也可以通过使用回调实现类似并发的行为。

如前所述,Node 的事件循环将发出的事件传递给回调函数以处理该事件。但是,在将任务传递给回调之后,循环不会等待它完成运行。而是前进到下一个事件。

Node.JS 请求模型

假设您要连接到与节点服务器不同的 API 来检索一些数据。然后,您从服务器向该特定的 API 发送请求,以及该函数调用,还传递了回调函数,并附有关于收到 API 的响应时如何处理的指令。Node 程序不等待 API 的响应。相反,在发送请求之后,它会继续执行程序的下一步。当来自 API 的响应到达时,回调函数开始在后台运行并处理接收到的数据。在某种程度上,回调函数同时运行到主程序线程。

相比之下,在同步多线程程序中,进行 API 调用的线程发送正在等待响应到达,以继续进行下一步。这不会使多线程程序停顿,因为即使该一个线程正在等待,线程池中的其他线程也准备接受接收请求。

异步功能使 Node.js 程序的单线程非常高效。它使程序快速且可扩展,而无需使用与多线程应用程序一样多的资源。

自然,这使 Node 非常适合于数据密集型和 I / O 密集型程序。数据密集型程序专注于检索和存储数据,而 I / O 密集型程序专注于与外部资源进行交互。

何时使用 Node.js?

现在回到我们的主要问题。什么时候应该在项目中使用 Node.js?考虑到 Node.js 的主要功能及其优势,可以说数据驱动,I / O 驱动,事件驱动和无阻塞应用程序可以从 Node.js 实现中受益匪浅。

网络服务器

Web 服务器是受益于 Node 固有功能的完美用例。每当接收到来自客户端的请求时,Node 的事件驱动实现可用于触发服务器中的事件。单线程和异步功能确保服务器可以使用回调在给定时间服务大量请求。将响应发送回客户端的过程由这些回调处理,而事件循环不断接受接收请求并将其传递给事件处理程序,而不会造成太多延迟。

尤其是,遵循微服务架构的 Web 后端(现在越来越流行)非常适合于 Node 实现。使用微服务架构,从一个微服务向另一个微服务发送请求变得不可避免。使用 Node 的异步编程,可以在不阻塞程序线程的情况下等待外部资源的响应。与多线程程序不同,由于许多线程正在等待来自外部资源的响应,该程序可能会用完线程来处理传入的请求,这种 I / O 密集型体系结构不会影响 Node 应用程序的性能。但是,实现繁重计算或繁重任务的 Web 服务器不适合 Node.js。

实时应用

诸如聊天应用程序,视频会议和在线游戏之类的实时应用程序受益于 Node 固有的功能集。这些数据密集型应用程序需要使用网络套接字和推送技术来在服务器和客户端之间建立双向通信。Node 处理 I / O 密集型任务的能力及其高可伸缩性是该语言通常用于实时应用程序的主要原因。这些特性使 Node 应用程序比其他语言更快。

命令行应用

构建命令行应用程序是 Node.js 的另一个常见应用程序。简单的语法,快速的开发以及为此目的可用的软件包数量是 Node 成为流行的命令行应用程序语言的原因。

创建 API

使用 Node.js 创建 API 越来越受欢迎。结合使用该语言与 NoSQL 数据库良好集成的能力,Node 非常适合为 NoSQL 数据库创建 API 前端。

何时不使用 Node.js

具有无法与 Node 特征完美融合的功能的程序不太适合 Node.js 开发。通常,阻塞,处理器密集型和计算密集型程序属于此类。

繁重的计算应用

如果您的应用程序可能运行涉及大量计算和数字运算的任务,例如运行 Fibonacci 算法,则 Node.js 并不是最好的语言。如上所述,繁重的计算会阻止应用程序中运行的单线程,并停止事件循环的进程,直到计算完成。并且它会延迟为仍在队列中的请求提供服务,这可能不会花费太多时间。

如果您的应用程序有一些繁重的计算任务,但总体上受益于 Node 的特性,则最佳解决方案是以另一种合适的语言将这些繁重的计算任务作为后台进程来实现。最好的解决方案是使用微服务架构并将繁重的计算任务与 Node 实现分开。

具有关系数据库的后端

尽管如此,与其他语言相比,Node 的关系数据库支持工具仍未达到预期的水平。对于关系数据库的用例,这使 Node 不受欢迎。但是,这种情况正在迅速改变。诸如 Sequealize 和 TypeORM 之类的高质量 ORM 库已经可供 Node 开发人员使用。将这一点从 when-not-to-use-node.js 列表中剔除可能不会花很长时间。

结论

像其他任何编程语言一样,Node.js 最适合某些编程任务,而不适合其他某些任务。充分利用 Node 在各个方面的优势,是您作为程序员的工作。当涉及到 Node 时,它的事件驱动,单线程和异步功能使其在速度和可伸缩性方面具有优势。但是他们在考虑计算繁重任务的情况下使 Node 处于劣势。现在,您可以在适当的情况下利用语言的更好质量。


标题:什么项目需要使用Node.js
作者:给我丶鼓励
地址:https://blog.doiduoyi.com/articles/1591799779669.html

评论

发表评论