Node.js 由于使用节点JS进行迭代,API速度变慢

Node.js 由于使用节点JS进行迭代,API速度变慢,node.js,Node.js,我正在使用NodeJS创建RESTAPI 在我的场景中,我有两个API API 1-->必须获得10000条记录并进行迭代以修改某些数据 API 2:简单的get方法 当我打开PostMan并点击第一个API和第二个API并行时 因为节点JS是单线程的,这会导致第二个API获取响应的速度变慢 我的期望: 即使第一个API获得了时间,它也不应该在很长的时间内成为第二个API 从NodeJS文档中,我发现了集群的概念。 所以我实现了集群,它创建了4个服务器实例。 现在我在一个选项卡中点击了API1,

我正在使用NodeJS创建RESTAPI

在我的场景中,我有两个API

API 1-->必须获得10000条记录并进行迭代以修改某些数据

API 2:简单的get方法

当我打开PostMan并点击第一个API和第二个API并行时 因为节点JS是单线程的,这会导致第二个API获取响应的速度变慢

我的期望: 即使第一个API获得了时间,它也不应该在很长的时间内成为第二个API

从NodeJS文档中,我发现了集群的概念。 所以我实现了集群,它创建了4个服务器实例。 现在我在一个选项卡中点击了API1,在第二个选项卡中点击了API2,效果很好。 但当我在4个选项卡中打开API1,再次打开第5个选项卡时,API2再次导致速度变慢


解决此问题的最佳解决方案是什么?

Node.js实际上不是多线程的,因此所有这些请求都只是在单个线程的事件循环中处理

每个Node.js进程在单个线程中运行,默认情况下,它在32位系统上的内存限制为512MB,在64位系统上的内存限制为1GB

但是,您可以将单个流程拆分为多个流程或工作进程。这可以通过集群模块实现。集群模块允许您创建子进程(工作进程),这些子进程与主节点进程共享(或不共享)所有服务器端口

您可以在应用程序中直接调用集群API,也可以在API上使用多个抽象之一


由于node.js的单线程特性,确保服务器始终响应快速请求(如您为API2所述)的唯一方法是确保服务器中没有任何长时间运行的操作

当您的代码中确实遇到需要一段时间才能运行并会影响服务器响应的操作时,您的选项如下:

  • 将长时间运行的工作移动到新进程。启动新进程,并在另一进程中运行长度操作。这允许您的服务器进程保持活动状态并响应其他请求,即使长时间运行的其他进程仍在处理其数据

  • 启动足够多的集群。使用您调查过的集群,启动的集群数量超过您预期的对长期运行流程同时调用的数量。这允许始终至少有一个集群进程可以响应。有时,你无法预测这将是多少,或者它将超过你实际创造的数量

  • 重新设计长时间运行的流程,以分块执行其工作,将控制权返回到分块之间的系统,以便node.js可以将其尝试执行的其他工作与长时间运行的工作交错。给你。这篇文章是为浏览器编写的,但是node.js中不阻塞事件循环太久的概念是相同的

  • 加速长时间运行的任务。找到一种方法来加速长时间运行的作业,使其不会花费太长的时间(使用缓存、不一次返回这么多结果、更快的方法等)

  • 创建N个工作进程(可能比您拥有的CPU数量少一个工作进程)并为长时间运行的任务创建工作队列。然后,当长时间运行的请求传入时,将其插入工作队列。然后,每个工作进程可以自由处理队列中的项目。当请求的任务超过N个时,第一个任务将立即得到处理,后面的任务将在队列中等待,直到有一个工作进程可以处理它们。但是,最重要的是,您的main node.js进程将保持自由,并对常规请求作出响应


  • 最后一个选项是最简单的,因为它对任何数量的长时间运行的请求都有效,尽管所有方案都可以帮助您。

    请给出一个需要迭代10000条记录并修改数据的示例。我想不出任何例子。你在用mongodb吗?postgre?不使用任何数据库。取决于两个外部服务。从外部服务获取数据后,您需要修改数据。但是,您如何可能需要在一次操作中更新10000多个数据?我仍然没有得到一个关于何时这样做的真实例子。请给我们一个真实的例子。