IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 什么时候应该和不应该在你的项目中使用 Node.js -> 正文阅读

[JavaScript知识库]什么时候应该和不应该在你的项目中使用 Node.js

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.JS 事件循环

Node.js 按照事件到达事件侦听器的顺序接受事件。接收到的最后一个事件被添加到事件队列的末尾,并在前面的事件完成后执行。

单线程

Node 的事件循环在处理事件时使用单线程实现。每个事件都按照它们到达的顺序由单个处理器线程一个接一个地处理。接收到 Node Web 服务器的请求按接收顺序提供。

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

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

Node.JS 与传统

Node.JS 与传统

Node 的单线程特性使程序具有高度的可扩展性。您可以使用为处理有限数量的请求而构建的相同程序来处理大量的请求。扩展多线程应用程序需要更多系统资源(如 RAM)以增加线程池中的线程数。

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

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

异步/非阻塞

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

正如我之前提到的,Node 的事件循环将发出的事件传递给回调函数来处理该事件。但是在将任务传递给回调之后,循环不会等待它完成运行。相反,它前进到下一个事件。回调函数完成后台运行。https://app.diagrams.net/images/osa_drive-harddisk.png

Node.JS 请求模型

Node.JS 请求模型

假设您想从 Node 服务器连接到单独的 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 的固有特性集。这些数据密集型应用程序需要使用 websockets 和推送技术来建立服务器和客户端之间的双向通信。Node 处理 I/O 密集型任务的能力及其高可扩展性是该语言被广泛用于实时应用程序的主要原因。与其他语言相比,这些特性使 Node 应用程序更快。

命令行应用程序

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

创建 API

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

何时不使用 Node.js

功能与 Node 特性不能很好融合的程序不适合 Node.js 开发。一般来说,阻塞、处理器密集型和计算密集型程序都属于这一类。

重计算应用

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

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

具有关系数据库的后端

尽管如此,与其他语言相比,Node 的关系数据库支持工具并没有达到预期的水平。这使得 Node 不适合关系数据库的用例。然而,这种情况正在迅速改变。像 Sequealize 和 TypeORM 这样的高质量 ORM 库已经可供 Node 开发人员使用。从 when-not-to-use-node.js 列表中删除这一点可能不需要很长时间。

结论

与现有的任何编程语言一样,Node.js 最适合某些编程任务,而不适合其他一些编程任务。利用Node在不同方面的优势是你作为程序员的工作。说到 Node,它的事件驱动、单线程和异步特性使其在速度和可扩展性方面具有优势。但是在考虑计算繁重的任务时,它们使 Node 处于劣势。现在,您可以在适当的情况下利用该语言的更好品质。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-30 15:31:56  更:2021-11-30 15:32:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 20:58:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码