如何将NodeJS请求分发到多个服务器并合并结果

时间:2018-04-22 03:16:23

标签: node.js

我有一个简单的NodeJS Web应用程序,它异步调用几个api并合并结果以返回一个大结果。现在让我们说我想优化它。我该怎么做?

我是NoeJS的新手,也是缩放系统的概念。我一直在阅读有关负载平衡,分布式系统等的内容......我认为这是正确的方法,但老实说,我不知道。

我在考虑做这样的事情 -

设置一个具有多个服务器的系统,每个服务器都有一个NodeJS webapp实例,该实例在给定路径的情况下进行api调用,并返回结果。

让主服务器从每个服务器获取结果,并合并结果并将其返回给客户端。

这是正确的方法吗?我使用什么技术?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我猜您正在尝试设置网络抓取或api抓取,以从第三方端点获取数据。如果确实如此,您将拥有一个用户/ ID列表,或者您传递给您调用的Web服务并获取数据的列表。

首先以非常快速且稳定的方式提出大量请求是棘手的,并且取决于若干因素是稳定且稳健的。

  1. 第三方API费率是否受限制。

  2. 发出请求的客户端计算机上的网络连接。

  3. 错误处理API和客户端错误,如连接重置等。

  4. 您要提取的大量数据,例如,您尝试尽快从第三方API抓取数百万用户的数据。

  5. 你的直觉是正确的,你必须在具有大量资源的机器上的几个服务器或至少几个并行节点进程上进行扩展,但是从小开始,测试,然后扩展将是我的建议。这是几个步骤。

    1. 使用良好的健壮节点http客户端,如axios

    2. 如果您正在处理大量项目(用户名,ID,电子邮件等),您将需要稳定的方法来迭代它们。将它们放在像 PostgreSQL MySQL 这样的数据库中。

    3. 从这里开始,了解API支持调用的最快速率。并编写稳定的函数来迭代您的输入'并调用API。

    4. 然后你有几个选择。如果您收集的数据与您提出的每个请求是分开的。您可以将其保存回每个输入的数据库中。如果您确实希望合并来自多个API调用的数据,则可以使用键值存储,例如 Redis 。您可以为每个调用提供一个ID,并为 input + request_id 格式创建一个组合键,然后在完成所有请求后,您可以将它们合并。

    5. 当您使用小型模型时,您现在可以添加一个好的作业管理器,如KueBull,并将数据库中的输入组从点(2)拆分)可以并行运行的几个作业。

    6. 一旦你有一个稳定的工作经理可以为输入重复此节点流程,现在你可以进行扩展。

    7. 在所有与同一个数据库和Redis通信的服务器上部署相同的代码。安装Node进程以使用PM2等进程管理器运行。

    8. 最后设置的工作方式是,同一节点程序的每个副本从源数据库中获取一组不同的输入(用户名/ ID等),并根据您的方式将结果写回数据库或Redis想要处理输出。

    9. 在redis上进行可选的后处理以获取键值对并合并按输入分组的响应。

    10. 编码此问题时,您必须高度注意的一些重要事项是:

      1. 内存管理:使用可节省大部分内存的设计模式/代码/库。在内存中加载绝对最少的内容。例如:在内存中迭代一百万个用户名的数组比将它们保存在数据库中并对它们进行分页更昂贵。

      2. 错误处理:会有很多错误。 API错误,无法预料的异常,内存泄漏,网络丢失等。拥有强大的错误处理和恢复机制将节省一天。

      3. 记录:优质的日志记录对于检查系统的不同部分的运行情况至关重要。请看winston

      4. 限制API调用:请记住,在同一分钟内进行10,000次API调用可能会导致您的计算机甚至大多数API崩溃。由于内存过载,至少会非常慢。但是,在每10次并行呼叫之间增加一点延迟(如10毫秒)将大大提高速度并使呼叫更加稳定。此策略称为限制限速 API调用。寻找适合您的问题的最佳位置非常重要。是的,进展缓慢实际上可以让你更快地达到目标!

      5. 您的问题非常广泛,没有具体的代码问题,这是一个通用策略,希望能为您提供一个良好的起点和参考资料的链接,以便您可以开始构建解决方案。

相关问题