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

U A*_*los 9 multithreading multiprocessing web-worker node.js

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

用例是:(1)假设你想要做一个长期运行的任务上的视频文件,说60秒,也就是说jspm install,可以采取长达60秒.(2)你不能细分任务.

其他要求包括:

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

我见过这些提到的解决方案:

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

U A*_*los 12

简短的回答是:取决于

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

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

注意:

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


Zla*_*tko 5

你提到的是一个 CPU 密集型任务,并且是一个长时间运行的任务,这绝对不是 Node.js 的事情。您还提到了数百个同时执行的任务。

您可能会看看Gearman 作业服务器之类的东西- 这是一个专用的解决方案。

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

如果相对可以接受低于最佳性能的性能,并且您希望将代码保留在 JavaScript 中,您仍然可以这样做,但您应该有某种作业队列 - 例如 Redis 或 RabbitMQ。

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

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