gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:50:19 25 4
gpt4 key购买 nike

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

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

我当时正在考虑做这样的事情-

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

拥有一个主服务器,该服务器从这些服务器中的每一个获取结果,然后合并结果并将其返回给客户端。

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

最佳答案

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

首先,非常快速且稳定地发出大量请求非常棘手,并且要取决于稳定和可靠的几个因素。


是第三方API速率限制。
发出请求的客户端计算机上的网络连接。
API和客户端错误的错误处理,例如连接重置等。
您正在回取的数据量之大,就像您试图尽快从第三方API抓取数百万用户的数据一样。


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


使用良好的健壮节点http客户端,例如axios
如果您要处理大量项目(用户名,ID,电子邮件等),则需要稳定的迭代方法。将它们放在PostgreSQL或MySQL之类的数据库中。
从这里开始,找出您的API支持调用的最快速率。并编写稳定的函数以遍历“输入”并调用API。
然后,您有两个选择。如果您收集的数据对于您的每个请求都是分开的。您可以为每个输入将其保存回数据库中。如果您确实想合并来自多个API调用的数据,则可以使用键值存储(例如Redis)。您可以为每个呼叫提供一个ID,并为input + request_id格式创建一个组合键,然后在完成所有请求后就可以合并它们。
当您使用小规模模型时,现在可以向组合中添加诸如KueBull的良好作业管理器,并将数据库中的输入集从点(2)拆分为可以并行运行的多个作业。
一旦有了一个稳定的作业经理,就可以针对一系列输入重复此节点过程,那么现在您可以进行扩展。
在所有与同一数据库和Redis通信的服务器上部署相同的代码。安装Node进程以使用诸如PM2之类的进程管理器运行。
最后,安装程序的工作方式是,同一节点程序的每个副本从源数据库获取一组不同的输入(用户名/ ID等),并将结果写回数据库或Redis,具体取决于您要如何处理输出。
对redis的可选后处理,以获取键值对并合并按输入分组的响应。


在编写此问题时,您必须高度意识到一些重要的事情:


内存管理:使用可节省大部分内存的设计模式/代码/库。绝对将所需的最小内容加载到内存中。例如:在内存中包含一百万个用户名的数组上进行迭代比将它们保留在数据库中并对其进行分页要昂贵得多。
错误处理:会有很多。 API错误,无法预料的异常,内存泄漏,网络中断等。拥有强大的错误处理和恢复机制将节省很多时间。
日志记录:高质量的日志记录对于保持检查系统不同部分的运行状况至关重要。看winston
限制API调用:切记在同一分钟内进行10,000个API调用可能会导致您的计算机甚至大多数API崩溃。至少由于内存过载,运行速度非常缓慢。但是,每10个并行调用之间增加一点延迟(例如10毫秒)将极大地提高速度,并使调用更加稳定。这种策略称为限制或速率限制API调用。找到适合您问题的最佳解决方案很重要。是的,慢慢来实际上可以使您更快地达到目标!


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

关于node.js - 如何将NodeJS请求分发到多个服务器并合并结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49962173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com