5 个增强功能将提升你的 Node.js 应用

2025-05-24

5 个增强功能将提升你的 Node.js 应用

在应用程序工作流程中,需要注意许多方面,以确保编写的代码能够以最佳效率执行。假设您构建了一个 Node.js 应用程序。在生产部署后,您发现应用程序的运行速度越来越慢。

那么,此时此刻,你脑海中浮现的问题是,如何才能加速并让你的 Node.js 应用运行得更快?在本文中,我们将讨论大规模扩展和加速 Node.js 应用程序所需的技巧和工具。

概述

Node.js是一个开源的跨平台 JavaScript 运行时环境。它用于运行服务器端应用程序。Node.js 可用于构建需要数据密集型模型的各级应用程序。

Node.js 在服务器端 Web 开发领域占据主导地位,是最受欢迎的 Web 框架和技术之一。这项Stack Overflow 调查清晰地展现了 Node.js 与 Django、Laravel、Ruby on Rails 和 Flask 等其他服务器端技术的竞争态势。

图片描述

图像源

Node.js 如此受欢迎是有原因的,包括:

  • Node.js 非常容易理解。Node.js 是基于 JavaScript(一种常用的编程语言)构建的。由于 JavaScript 的流行,Node.js 的入门和运行也变得相对容易。

  • Node.js 拥有一个庞大的生态系统,即 Node 包管理器 (NPM)。NPM一个 Node.js 仓库,允许使用和访问涵盖整个 Node.js Web 开发流程的开源库。这些库允许您安装并随时使用代码。这最终节省了大量开发时间,同时仍然能够交付轻量级、可扩展且高速的应用程序。

  • Node.js 极其轻量且快速,允许开发人员创建高性能应用程序。它基于高性能V8 引擎构建,用于编译和执行 JavaScript 代码。

作为开发者,您希望充分利用 Node.js 的功能来构建高度可扩展的应用程序。然而,您需要不同的工具来确保您的 Node.js 应用程序运行得更快。让我们讨论一下开发者可以用来优化和提升 Node.js 提供的快速架构的技巧和工具。

如何提升你的 Node.js 应用程序?

1. 使用消息代理

消息代理是一种在两个或多个应用程序/应用程序子集之间提供稳定可靠通信的软件。本质上,消息代理采用一种架构技术,允许你将应用程序拆分开来,同时仍然确保异步通信。

在这种情况下,消息是您希望从一个应用程序处理到另一个应用程序的信息。代理充当在应用程序之间传输实际数据有效负载的媒介。消息代理使用队列系统进行保存。它按照接收顺序管理队列,并将其传递给实际的一方。

以下是消息代理工作的总体架构:

图片描述

现在我们已经了解了消息代理是什么。它如何增强应用程序的可扩展性?为了回答这个问题,让我们来了解一下消息代理提供的更高层次的优势:

  • 简化解耦 - 消息代理消除了应用程序之间的依赖关系。消息代理充当客户端和服务器之间的中间人。服务器负责将数据发送给代理。服务器无需直接与消息接收者联系。当客户端需要数据时,只需随时从代理获取消息即可。无需使用发现方法来识别服务器实例的位置。消息代理会处理这些情况。

  • 提升架构可靠性 - 无论客户端是否处于活动状态,服务器都可以发送消息,反之亦然。唯一必须运行的组件是消息代理。服务器发送消息后,其工作就完成了。现在,代理的工作就是将消息传递给合适的接收者。

  • 异步处理 - 假设您正在使用 REST 架构运行 Node.js 的全功能 API。服务器和客户端紧密耦合,用于发出请求、响应和交换数据。两者使用基于 HTTP 协议的指定端点直接通信。在这种情况下,如果客户端发送请求,它期望服务器立即响应。REST 通信是同步设计的。它适用于必须返回响应的预定义请求。如果响应失败,可能会发生不良的用户体验,例如超时错误。另一方面,消息代理是异步的。没有人需要等待。在这样的架构中永远不会发生超时错误。

这对您的 Node.js 应用程序有何益处?

  • 提升系统性能 - 消息代理使用消息队列进行异步通信。高需​​求进程可以隔离为独立的进程。这确保了数据传输的优化,因为任何系统组件都不会因为等待其他组件而停滞。这将有助于提升您的应用程序性能并增强用户体验。

  • 可扩展性——服务器和客户端都可以根据数据需求进行扩展和收缩。即使在需求高峰期,组件也可以持续向队列添加条目,而不必担心系统崩溃。同样,客户端也可以根据传入数据进行扩展和工作负载分配。

在这个repo中可以找到很棒的消息代理示例,而我最近发现的一个新的消息代理是Memphis。它非常适合 node.js/typescript/NestJS(在这里阅读更多 [Memphis SDKs for Node.js/Typescript] https://docs.memphis.dev/memphis-new/sdks/node.js-typescript)),并且采用了现代的“开发优先”方法。

2. 使用 gRPC 构建 Node.js

gRPC是一个开源远程过程调用 (RPC) 框架,用于构建可扩展的快速通信微服务。它可以帮助您在服务之间创建高性能的通信协议。RPC 框架使用客户端直接调用服务器上的函数。简而言之,RPC 是一种协议,它允许一个程序执行位于另一台计算机上的另一个程序的进程,而无需明确编写网络交互的细节。它由底层框架自动处理。

gRPC 框架有何特别之处?

  • 它使用 HTTP/2 协议。诸如 REST 之类的架构使用传统的 HTTP 1.1 作为传输协议。该协议基于请求-响应模型,使用通用的 HTTP 方法,例如 GET、POST、PUT 和 DELETE。如果多个客户端提交请求,则每次只接受一个请求。HTTP/2 协议除了支持请求-响应模型外,还支持双向通信模型。它可以同时处理多个请求和响应。这在服务器和客户端之间建立了松散的耦合,使您能够构建快速高效的应用程序,并支持低延迟的流式传输。

  • 它使用协议缓冲区(protobuf) 作为消息格式。使用 SOAP 协议交换数据时,信息通过 XML 进行交换。使用 REST 时,数据使用 JSON 格式交换。在 gRPC 中,数据通过协议缓冲区交换。与 XML 和 JSON 相比,协议缓冲区更轻量、更快、更高效,并且负载更少。在底层,它对结构化数据进行序列化。protobuf 编译器将数据结构转换为 protobuf 二进制格式,用于描述客户端和服务器之间的通信格式。

  • 与语言无关 - 大多数现代语言和框架都广泛支持 gRPC,例如 Node.js、Python、Go Java、PHP 和 C#。客户端和服务器可以使用不同的语言/框架构建。它比传统 API 更灵活,因为客户端可以使用任何函数,而不仅仅是典型的 GET、POST 和 DELETE 方法。

使用 gRPC 运行 Node.js 对您的应用程序有何益处:

  • 更快的通信 - gRPC 使用 HTTP/2。这最大限度地减少了延迟和网络带宽占用,从而确保更流畅的用户体验。同时,它由 API 驱动,为您提供灵活的界面设计。

  • 提升应用程序性能 - REST 使用同步调用。这确保服务器在继续执行之前已返回响应。而 gRPC 异步查询会立即返回,并将响应作为独立任务进行处理。

  • 轻量级消息 - 与 JSON 消息相比,协议缓冲区被认为更小,差异高达 30%

gRPC 和消息代理可帮助您处理和管理应用程序消息。查看gRPC 与消息代理的比较

3. 使用集群优化 Node.js

Node.js 是单线程的。默认情况下,它只使用一个 CPU 来执行应用程序。这意味着,如果您的机器上有 8 个 CPU,即使执行 CPU 密集型操作, Node.js 线程也会被创建并只使用一个 CPU。这会阻碍应用程序充分利用底层裸机的全部功能,从而可能导致服务器死锁。

为了解决这个问题,Node.js 使用集群。集群是一组在计算机上运行的节点实例。在这种情况下,Node.js 使用主 CPU 作为其主实例,其他可用的 CPU 作为工作实例。

Node.js 集群允许联网的 Node.js 应用程序跨可用 CPU 数量进行扩展。以下是节点集群的一个基本示例。

图片描述

图片来源

这台计算机有 4 个处理器。默认情况下,Node.js 的单线程特性只会利用一个 CPU。但是,我们可以使用 Node.js集群模块在可用的 CPU 上生成任务。Node.js 可以运行子进程并共享服务器端口,同时仍然能够与父 Node 进程通信。根据提供的 CPU 数量,它可以显著提升应用程序的性能、效率和可靠性。

4.负载均衡

假设您有一个 Web 应用,具体来说是一个在线商店。用户将使用域名访问您的商店。该域名将与服务器通信,以便在用户端完成操作。但是,当访问您在线商店的流量很大时,对资源的需求就会增加。

您可能需要设置额外的服务器来分担流量。这种情况会导致您的应用程序拥有多个副本。但是,如何指导用户使用副本服务器的资源呢?如果所有用户都连接到初始服务器,那么您的资源就会耗尽,导致其他实例服务器无法使用。

此时,您需要平衡访问所有服务器的流量。您实际上正在做的就是负载均衡,以均匀分配流量。这可以使您的应用程序达到最佳性能,并确保没有节点过载。

图片描述

图片来源

负载均衡是指在给定的资源集合内分配应用程序任务,以确保整体资源的高效利用。这样,所有客户端请求都会均匀地分配给管理应用程序的后端节点。

为了根据资源需求扩展部署,在 Node.js 中配置负载均衡器至关重要。NGINX 是用于在 Node.js 中部署负载均衡的常用工具之一。Nginx是一个开源工具,允许您为客户端流量配置 HTTP 和 HTTPS 服务器。

图片描述

图片来源

通过中断流量,负载均衡器可以防止应用程序故障,并提高性能和可用性。使用负载均衡器构建 Node.js 分布式系统会对您的应用程序带来哪些好处?

  • 水平可扩展性——分发应用程序实例可以使其管理更多数量的传入请求。

  • 减少服务器停机时间

  • 灵活性

  • 冗余

  • 效率

5.缓存

缓存是指临时存储可能被重复访问的数据。这种做法使用内存缓冲区来临时保存应用程序的查找信息。

缓存通过确保任何重复性任务都不再从服务器检索,而是从内存缓冲区检索,从而简化了服务交付。这样,如果请求来自客户端,它将首先检查缓存中保存的任何查询,而无需访问服务器。

图片描述

图片来源

当服务器在同一个请求中频繁地提供资源时,会增加向客户端的数据延迟。通过缓存层提供此类计算,可以最大程度地缩短数据传递和响应请求的延迟。

图片描述

图片来源

第一次发送请求并调用服务器称为缓存未命中。输出将保存在缓存中,然后再将数据返回给用户。

图片描述

图片来源

如果请求的数据在缓存中找到,则称为缓存命中。结果将从缓存存储中返回,无需再次处理复杂的数据查询。

图片描述

图片来源

始终检查缓存命中率并相应地优化缓存策略至关重要。缓存层数并非无限。因此,您需要有效的缓存管理。例如:

  • 在一定时间后使缓存无效。

  • 删除缓存以确保缓存命中率保持较高。

  • 当缓存使用率低于一定阈值时,使缓存无效。

分布式系统需要完成许多 API 调用才能匹配单个响应负载。使用缓存运行此类调用可以显著降低数据聚合的成本。运行此类 Node.js 任务缓存可以:

  • 大大减少数据查询响应时间。

  • 提高应用程序的可扩展性。

  • 减少服务器负载,大大提高服务器性能。

  • 缓存可以提高数据库性能。缓存的请求无需访问服务器,这意味着数据请求查询无需访问数据库层。

Node.js 缓存工具包括:

  • Redis 缓存。Redis 使用内存数据库来存储整个数据集,从而减少了查找的额外成本。

  • 使用缓存反向代理,例如Varnish Cache。Vanish是一个 HTTP 加速器工具,可以保存服务器端的请求和响应,从而减少 Node.js 服务器的加载时间。

  • 使用 Node.js 应用服务器HTTP 缓存中间件。它允许您添加与 Node.js HTTP 连接的缓存中间件,以减少 API 延迟。

  • 使用Nginx 进行内容缓存。Nginx 缓存应用服务器的静态和动态内容,以简化客户端交付并减少服务器负载。

增强 Node.js 应用功能的其他做法

您可以使用多种实践来确保 Node.js 能够扩展您的
应用程序。其他实践和工具包括:

结论

构建应用程序是与用户建立联系的第一步。您的应用程序需要日常维护,才能为用户提供稳定的体验。本指南帮助您了解了一些常用策略和增强工具,可用于提升您的 Node.js 应用程序的性能。

文章来源:https://dev.to/chegerose/5-enhancements-that-will-boost-your-nodejs-app-3pj5
PREV
性别歧视、种族歧视、有害积极性和 TailwindCSS 为 TailwindCSS 辩护 为对 TailwindCSS 有害积极性的批评辩护 性别歧视和种族歧视 编辑:
NEXT
每个开发人员都需要的非技术技能