在NodeJS中处理长时间运行的进程?

我已经看到一些较旧的post涉及这个主题,但我想知道当前,现代的方法是什么。

这个用例是:(1)假设你想在一个video文件上做一个长时间运行的任务,比如60秒 ,说jspm install可能需要60秒。 (2)你不能细分任务。

其他要求包括:

  • 需要知道任务何时完成
  • 很高兴能够停止正在运行的任务
  • 稳定性:如果一个任务死亡,它不会closures服务器
  • 需要能够处理100个同时请求

我见过这些解决scheme:

  • nodejssubprocess
  • webworkers
  • 光纤 – 不用于CPU绑定的任务
  • 生成器 – 不用于CPU绑定的任务
  • https://adambom.github.io/parallel.js/
  • https://github.com/xk/node-threads-a-gogo
  • 任何其他?

现代的,基于标准的方法是什么? 而且,如果nodejs不适合这种types的任务,那么这也是一个有效的答案。

简短的答案是:取决于

如果你的意思是一个nodejs 服务器 ,那么这个用例的答案是否定 。 Nodejs的单线程事件不能处理CPU绑定的任务,因此将工作外包给另一个进程或线程是有意义的。 但是,对于CPU限制任务长时间运行的用例,find一些排队任务的方法是有意义的,即使用工作队列是有意义的。

但是,对于运行JS代码( jspm API )的这种特殊用例,使用使用nodejs的工作队列是有意义的。 因此,解决scheme是:(1)使用一个nodejs服务器,该服务器除了在工作队列中排队执行任务外什么也不做。 (2)使用一个nodejs工作队列(如kue )来做实际的工作。 使用cluster将工作分散在不同的CPU上。 其结果是一个简单的单一服务器,可以处理数百个请求(无窒息)。 (好吧,差不多,看下面的说明…)

注意:

  • 上述解决scheme使用过程 。 我没有调查线程解决scheme,因为它似乎已经不再受节点青睐。
  • 工作者队列+集群给你一个线程池的等价物。
  • 是的,在最坏的情况下,第100个并行请求将花费25分钟在4核机器上完成。 解决方法是旋转另一个工作队列服务器(如果我没有弄错,像kue这样的db支持的工作队列,这是微不足道的 – 只是使每个点服务器指向相同的数据库)。

你提到一个CPU绑定的任务,而且是一个长期运行的任务,这绝对不是一个node.js的东西。 您还提到了数百个同步任务。

你可以看看像Gearman作业服务器这样的东西 – 这是一个专门的解决scheme。

或者,您仍然可以让Node.jspipe理请求,而不是执行实际的作业。

如果可以接受的是性能相对较低,并且希望保留JavaScript代码,那么仍然可以这样做,但是应该有一些工作队列,比如Redis或者RabbitMQ。

我认为,无论您的运行时间如何,作业队列都是长期运行的数百个/秒任务的必备要求。 除非您可以在其他服务器/服务/机器上产生这个工作 – 那么您并不关心,您的Node.js API只是作业集群的前端和pipe理层,那么Node.js对于作业来说是完全可以的,你需要把重点放在这个工作组上,然后你可以提出一个更好的问题。

现在, node.js仍然可以在这里对你有用,它可以帮助pipe理和保存这些数百个任务,具体取决于它们来自哪里(例如,你可能只允许请求通过你的工作服务器为某些用户,或限制其他人的“暂停”function等。