如何设计 NodeJs worker 来处理并发的长时间 运行 作业

How to design a NodeJs worker to handle concurrent long running jobs

我正在做一个小的副项目,想把它做大,但我不太确定怎么做。我的问题是,我应该如何设计我的 NodeJs worker 应用程序才能同时执行多个 long 运行 作业? (即我应该使用多处理库、负载平衡器等)

我目前的情况是我有一个 NodeJs 应用程序 运行 纯粹用于服务网络请求并将作业放在队列中,而另一个 NodeJs 应用程序读取该队列执行这些作业(在 heroku worker dyno 上).每个作业可能需要 1 小时到 1 周的时间来完全写入数据库。由于这项工作的性质,而且它特别需要一个 npm 包,我觉得我应该使用 Node,但与此同时,我不确定它是否是最佳选择,因为我想扩展它以便数百个的作业可以同时执行。

任何 advice/suggestions 关于我应该如何构建此设计的任何信息都将不胜感激。谢谢。

首先,单个 node.js 应用程序可以处理许多仅来自数据库的 reading/writing 作业,因为这些活动大多是异步的,这意味着 node.js 花费了它的大部分时间在等待数据库响应上次请求时什么也不做。因此,您可能有一个 node.js 应用程序可以处理至少数百个作业,甚至可能是数千个作业(具体取决于作业的具体内容)。事实上,如果单个 node.js 应用程序可以在您的数据库中投入比数据库可能跟上的更多工作,我不会感到惊讶。

然后,如果您想扩展 运行 这些工作的工作人员 node.js 应用程序的数量,您可以简单地启动任意数量的工作人员应用程序(以及您的硬件可以启动的数量) handle) 使用 child_process 模块。您在主 node.js 应用程序中创建一个中央工作队列。然后,创建一堆 child_processes,其工作是从工作队列中抓取 N 个项目并处理它们。请注意,我建议您一次抓取 N 个项目,因为由于 I/O 与您的数据库异步,单个 node.js 进程可能可以同时处理多个单独的作业。

您可能还想探索甚至不需要工作队列的集群模块。您可以根据需要启动任意数量的主应用程序集群实例,它们都可以共享工作负载(服务网页和处理长 运行 作业)。通常的准则是为计算机中的每个 CPU 设置一个集群实例。所以,如果你有 4 个核心,你将设置一个集群,其中总共有四个服务器。