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

时间:2018-02-06 03:32:50

标签: javascript node.js heroku worker long-running-processes

我正在开展一个小型项目,并希望将其发展出来,但我不太清楚如何。我的问题是,我应该如何设计我的NodeJs工作者应用程序,以便能够同时执行多个长时间运行的作业? (即我应该使用多处理库,负载均衡器等)

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

关于我应该如何设计这个设计的任何建议/建议将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

首先,单个node.js应用程序可以处理大量只是从数据库读/写的作业,因为这些活动大多是异步的,这意味着node.js在等待数据库时大部分时间都在做什么从最后一个请求回复。因此,您可能只有一个node.js应用程序可以处理至少数百个作业,甚至数千个作业(具体取决于作业正在做什么)。事实上,如果单个node.js应用程序可以在您的数据库中投入比数据库可能跟上的更多工作,我不会感到惊讶。

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

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