代码之家  ›  专栏  ›  技术社区  ›  Orange

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

  •  -2
  • Orange  · 技术社区  · 7 年前

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

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

    如有任何关于我应该如何设计此设计的建议,将不胜感激。非常感谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   jfriend00    7 年前

    首先,一个节点。js应用程序可以处理许多仅仅从数据库读写的作业,因为这些活动大多是异步的,这意味着节点。js在等待数据库响应上一个请求时,大部分时间都在无所事事。所以,您可能只有一个节点。js应用程序可以处理至少数百个作业,甚至数千个作业(具体取决于作业所做的)。事实上,如果一个节点。js应用程序可能会在您的数据库中投入比数据库可能完成的更多的工作。

    然后,如果要缩放工作节点的数量。js应用程序正在运行这些作业,您可以使用child\u进程模块简单地启动任意数量的工作应用程序(以及硬件可以处理的任意数量)。您可以在主节点中创建一个中心工作队列。js应用程序。然后,创建一组child\u进程,其任务是从工作队列中获取N个项目并进行处理。注意,我建议您一次抓取N个项目,因为只有一个节点。由于对数据库的异步I/O,js进程可能可以同时处理多个单独的作业。

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