繁体   English   中英

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

[英]How to design a NodeJs worker to handle concurrent long running jobs

我正在做一个小型项目,并希望将其发展壮大,但我不太确定如何进行。 我的问题是,我应该如何设计我的 NodeJs 工作应用程序才能同时执行多个长时间运行的作业? (即我应该使用多处理库、负载平衡器等)

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM