首页 > 解决方案 > 处理大量出站 HTTP 请求

问题描述

如果我希望有大量来源,我正在构建一个提要阅读器应用程序。我会在给定的时间间隔(例如,每小时)内从每个源请求新数据,然后将响应缓存在我的服务器上。我假设同时从所有来源请求数据不是最佳解决方案,因为我可能会遇到网络拥塞(我很想知道是否还会有其他瓶颈)。

执行如此大量请求的有效方法是什么?

谢谢

标签: node.jshttp

解决方案


因为,任何给定的请求都没有紧迫性,您只想确保定期点击它们,您可以及时将所有请求分开。

例如,如果您有 N 个来源,并且您想每小时点击一次,您只需创建所有来源的列表,并跟踪下一个来源的索引。然后,计算你可以在一个小时内完成每个请求的距离。

因此,如果您有 N 个请求每小时处理一次:

let listOfSources = [...];
let nextSourceIndex = 0;

const cycleTime = 1000 * 60 * 60;    // an hour in ms
const delta = Math.round(cycleTime / listOfSources.length);

// create interval timer that cycles through the sources
setInterval(() => {
   let index = nextSourceIndex++;
   if (index >= listOfSources.length) {
       // wrap back to start
       index = 0;
       nextSourceIndex = 1;
   }
   processNextSource(listOfSources[index]);
}, delta);

function processNextSource(item) {
   // process this source
}

请注意,如果您有很多来源并且处理每个来源都需要一些时间,那么您可能仍然有多个来源同时“正在运行”,但这应该没问题。

如果处理确实是 CPU 或网络繁重,您将不得不密切关注您是否陷入困境并且无法在一小时内完成所有来源。如果是这种情况,根据瓶颈问题,您可能需要更多带宽、更快的存储或更多的 CPU 应用于项目(可能使用工作线程或子进程)。

如果源的数量是动态的,或者处理每个源的时间是动态的,并且您已接近处理限制,则可以使该系统具有适应性,以便在它变得过于繁忙时,它会自动将事物分开多次一个小时,反之亦然,如果事情不那么忙,它可以更频繁地访问它们。这将需要跟踪一些统计数据并计算一个新cycleTime变量并在每次循环中调整计时器。


有不同类型的方法。当您需要处理大量异步操作时,一个常见的过程是以其中 N 个在任何给定时间都在进行中的方式处理它们(其中 N 是一个相对较小的数字,例如 3 到 10)。这通常可以避免任何本地资源(例如内存使用、正在运行的套接字、带宽等)过载,同时仍然允许您在网络方面进行一些并行处理。如果您想尽可能快地通过所有这些而不会使本地资源不堪重负,那么这将是您可能使用的方法类型,而前面的讨论更多是关于及时将它们分开。

这是一个调用函数的实现,mapConcurrent()它异步迭代一个数组,同时运行的请求不超过 N 个。而且,这里有一个函数rateMap(),它在它支持的并发控制类型方面更加先进。


推荐阅读