首页 > web前端 > js教程 > 扩展 Node.js 应用程序的方法、行为和策略

扩展 Node.js 应用程序的方法、行为和策略

Mary-Kate Olsen
发布: 2024-12-28 10:44:15
原创
294 人浏览过

yths, acts, and trategies to Scale Node.js Apps

Node.js 在过去十年中已成为开发人员的首选解决方案,以其处理并发连接和支持高性能应用程序的能力而闻名。根据我使用富文本编辑器处理 Express 项目的经验,我亲眼目睹了 Node.js 如何将内容创建应用程序转变为可扩展、可定制的解决方案。但这里有一个大问题:Node.js 真的能够扩展以支持企业级数百万用户吗?

答案是肯定的,但现实要微妙得多。 Node.js 旨在扩展,但其扩展性能在很大程度上取决于应用程序架构、优化以及管理系统资源的方法。

关于 Node.js 和高流量的神话:什么是真的,什么是假的?

在处理高流量方面,Node.js 经常受到赞扬和怀疑。一些开发人员表示,它是实时应用程序的游戏规则改变者,而其他开发人员则认为,它在扩展到数百万用户时存在局限性。让我们来看看常见的误区:

误区 1:Node.js 无法处理高流量

现实: Node.js 构建在事件驱动的非阻塞 I/O 模型之上,实际上允许它轻松管理数千个并发连接。传统的服务器架构(Apache、PHP)为每个请求创建一个新线程并快速消耗资源,而 Node.js 则不同,Node.js 在单个线程上运行,使用事件循环异步处理任务。这种精确的设计可以最大限度地减少资源使用并提高可扩展性。

误区 2:Node.js 只是 JavaScript 并且缺乏功能

现实:虽然 Node.js 在 JavaScript 上运行,但它的力量来自 Google 的 V8 JavaScript 引擎,该引擎将 JavaScript 编译成优化的机器代码。这意味着 Node.js 不仅仅是运行脚本,它在许多用例中提供的性能可与编译语言相媲美。

误区 3:扩展 Node.js 很容易

现实:Node.js 的架构非常适合 I/O 密集型任务,例如 API 服务器、聊天应用程序和实时系统,但扩展到数百万用户需要深思熟虑的规划和正确的架构。负载均衡、集群和优化系统资源等技术是使其大规模运行的关键。

关于大规模 Node.js 的事实

揭穿神话后,让我们谈谈事实。 Node.js 已证明自己能够为高性能、可扩展的应用程序提供支持,但扩展到数百万用户并非没有挑战。

事实 1:Node.js 依赖单线程模型

让我们从 Node.js 架构的基础开始。其单线程、事件驱动模型非常适合 I/O 任务,这使得它能够高效地同时处理多个连接。然而,当涉及 CPU 密集型操作时,同一模型可能会成为瓶颈。单个线程上的大量计算可能会阻塞事件循环,从而导致处理其他请求的延迟。

虽然单线程是一个限制,但我们应该记住,Node.js 由于其非阻塞 I/O,也擅长同时处理多个连接。为了解决单线程模型的限制,您可以使用工作线程或微服务来卸载 CPU 密集型任务,具体取决于应用程序的架构。

事实 2:大规模内存管理至关重要

随着应用程序的增长,管理资源变得越来越重要。事实上,内存泄漏对于不断增长的 Node.js 应用程序来说可能是一个大问题。当对象或变量等资源没有得到正确清理时,就会发生这种情况。随着时间的推移,这会减慢一切,甚至导致服务器崩溃,尤其是在流量高峰时。
阿迪达斯的 Node.js 系统面临内存泄漏,随着用户群的增长,这导致了性能问题。 Adidas 软件工程总监 Aleksandar Mirilovic 在题为如何查找 Node.js 应用程序中的生产内存泄漏的文章中分享了他的经验。他发现对象不必要地保存在内存中,这导致资源膨胀。

他们是如何解决的:

TL;DR: 在尝试在本地和暂存中重现问题但失败后,阿迪达斯直接从生产环境中捕获了堆快照。根本原因可追溯到 Google reCAPTCHA 库为每个请求创建新的 gRPC 连接而不关闭它们。重构代码以使用单个客户端实例解决了问题,稳定了内存使用并提高了性能。

事实 3:跨 CPU 内核的扩展不是自动的

优化 I/O 和内存管理后,还需要考虑扩展的另一个方面:硬件利用率。默认情况下,Node.js 在单个线程上运行,这意味着它不会自动利用所有可用的 CPU 核心。 对于高流量应用程序,这可能是一个问题,因为服务器的许多处理能力可能未得到使用。许多开发人员没有意识到这一点,如果不设置集群之类的东西,他们就无法充分利用他们的硬件。

您可以使用 Node.js 集群模块来运行应用程序的多个实例,每个实例都在单独的 CPU 核心上运行。这会将工作负载分配到所有可用核心上,因此您的应用程序可以处理更多并发用户,并提高性能。

规模化战略

扩展 Node.js 以处理数百万用户不仅仅是编写高效的代码,还涉及构建可随用户群增长的基础架构。

策略一:负载均衡

单个服务器只能处理这么多——这是硬件限制。这就是负载平衡的用武之地。通过将流量分散到多个服务器上,您可以防止瓶颈并保持应用程序的响应能力。如果没有它,您可能会在流量高峰期间面临停机或性能低下的风险。

想想最近的例子:ChatGPT 用户因崩溃而感到沮丧,或者亚马逊购物者看到可爱的狗的图片而不是产品页面。负载平衡可确保需求激增期间的平稳运行。 NGINX、HAProxy 或 AWS Elastic Load Balancer 等工具可以在 Node.js 实例之间均匀分配请求,从而提高性能并添加冗余,因此即使服务器出现故障,您的应用程序也能保持在线。

策略 2:缓存

从数据库或外部 API 重复获取相同的数据可能会减慢您的应用程序并使后端资源紧张。缓存通过将频繁请求的数据存储在内存中来解决这个问题,使您的应用程序能够毫不费力地提供更快的响应并处理更多的流量。 Redis 和 Memcached 等工具改变了游戏规则,现实世界的示例展示了缓存的影响力有多大。

Redis 如何跨行业使用:

  • 电子商务:Gap Inc. 通过集成 Redis Enterprise 解决了让购物者感到沮丧的库存更新缓慢问题。即使在黑色星期五的流量高峰期间,这也减少了延误并提供了实时库存信息。

  • 欺诈检测:BioCatch 是一家数字身份公司,每月使用 Redis Enterprise 处理 50 亿笔交易。通过缓存行为数据和 API 响应,他们可以在 40 毫秒内检测到欺诈活动,领先于网络威胁。

缓存不仅仅关乎速度,它还提高可靠性、减少后端负载并防止购物车遗弃。

策略3:数据库性能

即使缓存到位,高流量应用程序中的薄弱环节通常是数据库操作。低效的查询或设计不当的结构可能会减慢一切速度,让用户感到沮丧,让您的应用程序难以跟上。缓存对于加快频繁请求的速度非常有用,但您的数据库仍然需要有效地处理其余工作 - 特别是随着流量的增长。

为了更有效地处理高流量,您可以对数据库进行一些关键改进。首先,专注于微调查询——这意味着简化 SQL 语句、消除不必要的操作并添加索引以加快速度。

例如,如果您的应用经常搜索 user_id,为该列添加索引可以使数据库更快地找到它。接下来,减少应用程序发送的查询数量。不要对用户详细信息和订单发出单独的请求,而是使用联接将它们组合成单个查询。如果您的应用程序处理大量流量,则需要通过分片(将模式架构拆分为更小、更集中的数据块)或设置读取副本来分担繁重读取操作的负载来进行扩展。

仍然想知道 Node.js 是否可以承受压力?

它已经为世界上一些最大的平台提供了动力。 LinkedIn 从 Ruby on Rails 过渡到 Node.js,将服务器数量减少了 20 倍,同时支持超过 6 亿用户。 Netflix 依靠 Node.js 来管理数百万个并发流并提供更快的加载时间。 Uber 的工程堆栈利用其实时功能来无缝处理大量乘车请求。沃尔玛转向 Node.js,以确保其系统在黑色星期五流量激增期间平稳运行。

通过负载平衡、缓存和数据库优化等策略,Node.js 甚至可以处理最苛刻的工作负载。无论您是构建全球平台还是扩展以满足不断增长的流量,我愿意打赌,使用 Node.js 您可以真正创建快速、可靠且可扩展的应用程序。

以上是扩展 Node.js 应用程序的方法、行为和策略的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板