【问题标题】:How to scale a node server that will be having long-running tasks for each user如何扩展将为每个用户执行长时间运行任务的节点服务器
【发布时间】:2020-01-04 20:13:34
【问题描述】:

我正在构建一个服务,每个用户都可以执行长时间运行的任务(想想网络爬虫)。 Express API 将用于管理用户和启动流程。

我最初的计划是有一个 API 来启动子进程,这对少数用户来说很好。在某个点之后,服务器将达到容量,我不确定此时我可以做什么。

【问题讨论】:

    标签: node.js amazon-web-services server architecture


    【解决方案1】:

    如果您真的要让每个用户有一个长时间运行的进程,那么您将必须测试单个服务器将处理多少个这些进程,然后您将不得不添加服务器(可能使用任何一种集群形式或使用自定义代码在其他服务器上启动进程)当您扩展超出测试限制时。

    如果长时间运行的任务确实类似于网络抓取,那么您可能希望为此工作创建异步设计(而不是每个用户的进程)并使用工作队列在工作人员之间分配任何 CPU 密集型工作过程。 node.js 非常擅长一次运行大量与异步 I/O 相关的事情。您必须让其他 CPU 参与其中的是任何 CPU 密集型工作。如果不准确了解长期工作是什么,我们很难提出非常具体的建议。

    简而言之,应该尽可能地使用异步 I/O,它在 node.js 中本身可以很好地扩展。 CPU 密集型工作应该通过某种工作队列分流给其他 CPU。单主机集群(node.js 集群模块)甚至可以应用多个 CPU 来完成异步工作。一个工作队列和多个进程可以将多个 CPU 应用于 CPU 密集型工作。如果您需要比这更大的规模,那么您将需要一个工作队列管理器,它可以将作业分包给您的 pod 中的其他服务器。

    可以创建一个使用工作队列的设计,随着工作负载越来越高,您的服务器资源会达到最大负载并尽可能多地做,它只会增加响应时间,因为它需要更长的时间完成给定的请求(并且工作队列变得越来越长),但它仍在处理所有请求。对于尝试为每个用户创建一个新进程并最终通过消耗过多资源而使服务器不堪重负的设计,这将是可取的。

    【讨论】:

      【解决方案2】:

      AWS Fargate 可能是一个很好的解决方案:

      https://aws.amazon.com/fargate/

      将您的服务打包为 docker 容器,让 AWS 为您扩展。

      【讨论】:

        猜你喜欢
        • 2014-07-29
        • 2019-08-01
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 2016-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多