什么是将基于nodejs的API分离计算繁重的任务的推荐方法?

时间:2017-08-19 21:05:59

标签: node.js api scalability

我有一个NodeJS API可以执行基本的操作(比如操纵数据库),但是,更不常见的是,计算上会对像视频编码这样的东西产生负担。

从可扩展性的角度来看,似乎是一个更好的解决方案,就是将其拆分为主API服务器,并将工作分开。这样我就有两个游泳池,#34;低成本"对于主要的API和"昂贵的"对于工人来说,允许更好的资源管理。

这种模式有标准方法吗?

处理不常见的大量请求的唯一方法似乎是从头开始编写工作服务器或创建子进程。这些选项需要大量额外的代码(包括池化,排队等),问题似乎很常见,所以缺少节点工作包表明我的方法既已知又错误。

2 个答案:

答案 0 :(得分:2)

不确定这是否是serverfault的问题,但是这里是: 节点因计算昂贵的工作而臭名昭着,因为它适用于单线程模型。我建议你使用以下其中一种方法:

  1. 像你提到的那样隔离nodejs工人,但你需要在上面有一层来委派任务
  2. 在"下游服务中完成了昂贵的工作"接受HTTP请求。您的节点服务器现在可以连接到这些服务器,并在完成工作后接收异步响应。
  3. 现在下游服务可以写成(a)像Java这样的线程繁重的语言,它允许大量的计算工作,(b)大量的旋转节点进程或按需旋转,(c)独家计算Infra,如亚马逊Lambda

答案 1 :(得分:1)

在Node.js中,通常有三种方法可以处理繁重的任务:

1。在群集模式下使用Node

为了获得最佳性能,我们应该在逻辑上或物理上使用大多数CPU内核。 Node.js具有一个主线程和一个事件循环。在任何给定时间,Node.js的主线程只能使用一个CPU内核。我们可以做的是启动与CPU核心数量相同的Node.js实例/服务器数组。理想情况下,我们应该能够对Node.js实例数组应用负载平衡和运行状况检查,自动重新启动等功能。

PM2是建议的带有内置负载均衡器的Node.js应用程序的开源生产运行时和流程管理器。它使您可以使应用程序永远保持活动状态,无需停机即可重新加载它们,并简化了常见的Devops任务。

2。使用辅助线程

Node.js还提供了一个线程池(即工作池)。 In Node there are two types of threads:一个事件循环(又名主循环,主线程,事件线程等),以及一个工作池(又称线程池)中的k个工作池。

为了不阻塞主线程,我们应该将昂贵的任务卸载到Worker线程。

WebWorker Threads是推荐用于此方法的库。

3。将繁重的计算工作转移到其他服务器上

您可以将繁重的计算工作分散到单独的工作服务器上,使它们通过消息队列服务器(例如RabbitMQ)进行通信。这可能是最可扩展,灵活和可靠的方法。可以使用Node.js,Java或任何其他适当的技术来实现工作服务器。