将计算繁重的任务与基于 nodejs 的 API 分开的推荐方法是什么?
What is a recommended way to separate computationally heavy tasks from nodejs-based API?
我有一个 NodeJS API,它可以做一些基本的事情(比如操作数据库),但也有一些不太常见的计算任务,比如视频编码。
从可扩展性的角度来看,似乎更好的解决方案是将其拆分为一个主 API 服务器和独立的工作人员来完成繁重的工作。这样我就有了两个池,"low-cost" 用于主要 API 和 "expensive" 用于工作人员,以便更好地管理资源。
是否有针对此模式的标准方法?
处理不频繁的繁重请求的唯一方法似乎是从头开始编写工作服务器或创建子进程。这些选项需要大量额外的代码(包括池化、排队等),而且这个问题似乎很常见,所以缺少 node-worker 包表明我的方法既已知又错误。
不确定这是否是服务器故障的问题,但这里是:
Node 以计算量大的工作而臭名昭著,因为它在单线程模型上工作。我建议您使用以下替代方法之一:
- 像你提到的那样隔离 nodejs 工作人员,但你需要在上面有一个层来委托任务
- 在接受 HTTP 请求的 "downstream services" 中完成了昂贵的工作。您的节点服务器现在可以连接到这些并在工作完成后接收异步响应。
- 现在下游服务可以用 (a) 像 Java 这样的线程密集型语言编写,它允许繁重的计算工作,(b) 大量旋转的节点进程或按需旋转, (c) 像 Amazon Lambda 这样的独家计算基础设施
在Node.js中通常有三种方法来处理计算量大的任务:
1。在集群模式下使用 Node
为了获得最佳性能,我们应该在逻辑上或物理上制造大部分 CPU 个内核。 Node.js 有一个主线程和一个事件循环。在任何给定时间,Node.js' 主线程只能使用一个 CPU 核心。我们可以做的是启动一个 Node.js instances/servers 与 CPU 核数相同的数组。理想情况下,我们应该能够将负载平衡和健康检查、自动重启等应用于 Node.js 个实例的数组。
PM2 是推荐用于 Node.js 具有内置负载均衡器的应用程序的开源生产运行时和流程管理器。它允许您让应用程序永远保持活动状态,无需停机即可重新加载它们,并促进常见的 Devops 任务。
2。使用工作线程
Node.js 还提供了一个线程池(即 Worker Pool)。 In Node there are two types of threads:一个事件循环(又名主循环、主线程、事件线程等),以及 Worker Pool 中的 k 个 Workers 池(又名线程池)。
为了不阻塞主线程,我们应该将昂贵的任务卸载到工作线程。
WebWorker Threads 是推荐用于此方法的库。
3。将繁重的计算卸载到其他服务器
您可以将繁重的计算卸载到单独的工作服务器,让它们通过像 RabbitMQ 这样的消息队列服务器进行通信。这可能是最具可扩展性、最灵活和最可靠的方法。工作服务器可以在 Node.js、Java 或任何其他适当的技术中实现。
我有一个 NodeJS API,它可以做一些基本的事情(比如操作数据库),但也有一些不太常见的计算任务,比如视频编码。
从可扩展性的角度来看,似乎更好的解决方案是将其拆分为一个主 API 服务器和独立的工作人员来完成繁重的工作。这样我就有了两个池,"low-cost" 用于主要 API 和 "expensive" 用于工作人员,以便更好地管理资源。
是否有针对此模式的标准方法?
处理不频繁的繁重请求的唯一方法似乎是从头开始编写工作服务器或创建子进程。这些选项需要大量额外的代码(包括池化、排队等),而且这个问题似乎很常见,所以缺少 node-worker 包表明我的方法既已知又错误。
不确定这是否是服务器故障的问题,但这里是: Node 以计算量大的工作而臭名昭著,因为它在单线程模型上工作。我建议您使用以下替代方法之一:
- 像你提到的那样隔离 nodejs 工作人员,但你需要在上面有一个层来委托任务
- 在接受 HTTP 请求的 "downstream services" 中完成了昂贵的工作。您的节点服务器现在可以连接到这些并在工作完成后接收异步响应。
- 现在下游服务可以用 (a) 像 Java 这样的线程密集型语言编写,它允许繁重的计算工作,(b) 大量旋转的节点进程或按需旋转, (c) 像 Amazon Lambda 这样的独家计算基础设施
在Node.js中通常有三种方法来处理计算量大的任务:
1。在集群模式下使用 Node
为了获得最佳性能,我们应该在逻辑上或物理上制造大部分 CPU 个内核。 Node.js 有一个主线程和一个事件循环。在任何给定时间,Node.js' 主线程只能使用一个 CPU 核心。我们可以做的是启动一个 Node.js instances/servers 与 CPU 核数相同的数组。理想情况下,我们应该能够将负载平衡和健康检查、自动重启等应用于 Node.js 个实例的数组。
PM2 是推荐用于 Node.js 具有内置负载均衡器的应用程序的开源生产运行时和流程管理器。它允许您让应用程序永远保持活动状态,无需停机即可重新加载它们,并促进常见的 Devops 任务。
2。使用工作线程
Node.js 还提供了一个线程池(即 Worker Pool)。 In Node there are two types of threads:一个事件循环(又名主循环、主线程、事件线程等),以及 Worker Pool 中的 k 个 Workers 池(又名线程池)。
为了不阻塞主线程,我们应该将昂贵的任务卸载到工作线程。
WebWorker Threads 是推荐用于此方法的库。
3。将繁重的计算卸载到其他服务器
您可以将繁重的计算卸载到单独的工作服务器,让它们通过像 RabbitMQ 这样的消息队列服务器进行通信。这可能是最具可扩展性、最灵活和最可靠的方法。工作服务器可以在 Node.js、Java 或任何其他适当的技术中实现。