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

时间:2015-10-06 16:16:33

标签: node.js multithreading multiprocessing web-worker

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

用例是:(1)假设您要对视频文件执行长时间运行的任务,比如60秒,说jspm install可能需要60秒。 (2)你不能细分任务。

其他要求包括:

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

我见过这些解决方案:

哪种是现代的,基于标准的方法?此外,如果nodejs不适合这种类型的任务,那么这也是一个有效的答案。

2 个答案:

答案 0 :(得分:12)

简短的回答是:取决于

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

但是,对于运行JS代码(jspm API)的特定用例,使用使用nodejs的工作队列是有意义的。因此,解决方案是:(1)使用nodejs服务器,该服务器除了在工作队列中排队任务外什么都不做。 (2)使用nodejs工作队列(如kue)来完成实际工作。使用cluster将工作分散到不同的CPU。结果是一个简单的服务器,可以处理数百个请求(没有窒息)。 (好吧,差不多,请看下面的注释......)

注意:

  • 上述解决方案使用进程。我没有调查线程解决方案,因为它们似乎已经失去了对节点的青睐。
  • 工作队列+集群为您提供等效的线程池
  • 是的,在最坏的情况下,第100个并行请求将需要25分钟才能在4核计算机上完成。解决方案是启动另一个工作队列服务器(如果我没有弄错,使用像kue这样的数据库支持的工作队列,这是微不足道的 - 只需让每个点服务器指向同一个数据库) 。

答案 1 :(得分:4)

你提到了一个CPU绑定的任务,以及一个长期运行的任务,这绝对不是node.js的事情。你还提到了数百个同步任务。

你可以看一下类似Gearman job server之类的东西 - 这是一个专门的解决方案。

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

如果具有较低的最佳性能是相对可接受的,并且您希望将代码保留在JavaScript中,您仍然可以执行此操作,但是您应该拥有某种类型的作业队列 - 想到Redis或RabbitMQ等。< / p>

我认为无论运行时间如何,作业队列都是长时间运行,数百/秒任务的必备条件。除非您可以在其他服务器/服务/机器上生成此作业 - 那么您不关心,您的Node.js API只是作业集群的前端和管理层,然后Node.js完全可以胜任这项工作,你需要专注于那个工作集群,然后你可以提出一个更好的问题。

现在,node.js对您来说仍然有用,它可以帮助管理和保存这些数百个任务,具体取决于它们的来源(即,您可能只允许请求进入您的作业服务器某些用户,或将“暂停”功能限制为他人等。