API由于使用节点JS迭代而变得缓慢

我正在使用Node js创build一个REST API。

在我的情况下,我有两个API。

API 1 – >必须获得10,000条logging并进行迭代来修改某些数据

API 2:简单的获取方法。

当我打开post人,并击中第一个API和第二个API并行因为节点JS是单线程的,导致第二个API得到响应较慢。

我的期望:即使第一个API获得时间,也不应该让第二个API时间很长。

从节点JS文档我已经find了聚类的概念。 https://nodejs.org/dist/latest-v6.x/docs/api/cluster.html所以我实现了集群,它创build了4个服务器实例。 现在我在一个选项卡中的API 1和第二个选项卡中的API 2工作正常。 但是,当我在4个选项卡中打开API 1和第5个选项卡再次导致缓慢的API 2。

什么是解决问题的最佳解决scheme?

由于node.js的单线程性质,确保您的服务器始终能够响应快速请求的唯一方法(如您对API2所描述的)是确保您的服务器中永远不会有任何长时间运行的操作。

当你在你的代码中遇到一些需要运行一段时间并会影响服务器响应的操作时,你的选项如下:

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

  2. 启动足够的群集。 使用你所调查的集群,启动更多的集群,比你期望的同时调用你的长期运行的进程。 这允许始终存在至less一个可用于响应的集群进程。 有时候,你无法预测会有多less,或者会比实际创造的多。

  3. 重新devise你的长时间运行的进程,以大块的方式执行它的工作,在块之间把控制权交还给系统,这样node.js就可以把正在尝试做的其他工作与长时间运行的工作交错。 以下是一个以块为单位处理大型数组的示例 。 这篇文章是为浏览器编写的,但是不会阻塞事件循环太长的概念在node.js中是一样的。

  4. 加快长期运行的任务。 find一种方法来加快长时间运行的工作,所以不需要那么长时间(使用caching,不能一次返回那么多的结果,更快的方式来做,等等)。

  5. 创buildN个工作进程(可能比您拥有的CPU数less一个工作进程),并为长时间运行的任务创build一个工作队列。 然后,当长时间运行的请求进入时,将其插入到工作队列中。 然后,每个工作进程可以自由处理队列中的项目。 当要求超过N个长时间的任务时,第一个任务将被立即处理,后一个将在队列中等待,直到有可用的工作进程工作。 但是,最重要的是,您的主要node.js进程将保持自由和响应常规请求。

这最后一个选项是最简单的,因为它可以有效地处理任何长时间运行的请求,尽pipe所有的scheme都可以帮助你。

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

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

但是,您可以将单个进程分成多个进程或工作者。 这可以通过一个集群模块来实现。 群集模块允许您创buildsubprocess(worker),它们共享(或不)与主节点进程的所有服务器端口。

您可以直接在您的应用程序中调用Cluster API,也可以使用API​​中的许多抽象中的一种

https://nodejs.org/api/cluster.html