在 NodeJS 中处理长 运行 进程?

Handle long-running processes in NodeJS?

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

用例是:(1) 假设你想对一个视频文件做一个很长的 运行 任务 ,比如 60 秒长 ,比如 jspm install 最多可能需要 60 秒。 (2) 你不能细分任务。

其他要求包括:

我看到提到了这些解决方案:

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

您提到的是 CPU 绑定任务和长期 运行 任务,这绝对不是 node.js 的事情。您还提到了数百个并发任务。

您可能会看一下 Gearman job server 之类的东西 - 这是一个专门的解决方案。

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

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

我认为作业队列将是长期 运行、hundreds/sec 任务的必备要求,无论您的运行时间如何。除非你可以在其他 servers/services/machines 上产生这个工作 - 那么你不在乎,你的 Node.js API 只是工作集群的前端和管理层,然后 Node.js 非常适合这份工作,您需要专注于该工作集群,然后您可以提出更好的问题。

现在,node.js 在这里仍然对您有用,它可以帮助管理和保留数百个任务,具体取决于它们来自哪里(即,您可能只允许请求通过您的工作某些用户的服务器,或将 "pause" 功能限制给其他用户等

简短的回答是:取决于

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

但是,对于 运行 JS 代码 (jspm API) 的这种特殊用例,使用使用 nodejs 的工作队列是有意义的。因此,解决方案是:(1)使用一个 nodejs 服务器,它只在工作队列中排队任务。 (2) 使用 nodejs 工作队列(如 kue)来完成实际工作。使用 cluster 将工作分散到不同的 CPU 中。结果是一个简单的 单个 服务器可以处理数百个请求(w/o 令人窒息)。 (嗯,差不多,看下面的注释...)

注:

  • 上述解决方案使用了进程。我没有研究线程解决方案,因为这些解决方案似乎已不再受节点青睐。
  • worker queue + cluster 相当于 thread pool.
  • 是的,在最坏的情况下,第 100 个并行请求将需要 25 分钟才能在 4 核机器上完成。解决方案是启动另一个工作队列服务器(如果我没记错的话,使用像 kue 这样的数据库支持的工作队列这很简单——只需让每个点服务器指向同一个数据库)。

使用 Simple ConcurrentQueue 轻松地对长时间运行的进程执行并发执行。欢迎随时改进和分享反馈。

  • ‍ 创建您自己的自定义 ConcurrentExecutor 并设置您的并发限制。
  • Boom 你在并发模式下获得了所有 long-运行ning 进程 运行。

了解你可以看看: Concurrent Process Executor Queue