【问题标题】:How to know how many requests to make without knowing amount of data on server如何在不知道服务器上的数据量的情况下知道要发出多少请求
【发布时间】:2019-12-21 03:55:37
【问题描述】:

我有一个 NodeJS 应用程序,我需要从另一台服务器获取数据(第 3 方,我无法控制它)。服务器要求您指定要返回的最大条目数以及偏移量。例如,如果服务器上有100 条目,我可以请求100pageSize0offset,或10pageSize,并使用@987654328 进行10 个请求@ 1,2,3 等并执行 Promise.all(在计时时执行多个并发较小的请求会更快)。

var pageSize = 100;
var offsets = [...Array(totalItems / pageSize).keys()];
await Promise.all(offsets.map(async i => //make request with pageSize and offset));

唯一的问题是条目的数量发生了变化,并且服务器没有返回指示条目总数的属性。我可以做这样的事情,while 循环,直到服务器返回空:

var offset = 0;
var pageSize = 100;

var data = [];
var response = await //make request with pageSize and offset
while (response is not empty){
   data.push(response);
   offset++;
   //send another request

但这不像上面发送多个并发请求那样高效/快速。

有没有什么好的方法可以处理服务器上数据的动态长度?

【问题讨论】:

    标签: node.js dynamic server promise httprequest


    【解决方案1】:

    如果服务器没有给你一些关于有多少项目的提示,你就无法并行处理多个请求,因为你真的不想发送比需要更多的请求,也不想人为地发送对少量项目提出请求,以便您可以并行运行更多请求。

    您可以运行一些测试并找到一些实际限制。服务器和您的客户端似乎可以请求您请求的最大项目数是多少(100?1000?10,000?100,000?)并且只需请求那么多开始。如果它表明之后还有更多,则发送另一个类似大小的请求。

    这样做的主要思想是最大限度地减少单独请求的数量,并最大限度地提高您在一次调用中可以获得的数据。这应该比更多的并行请求更有效,每个请求更少的项目,因为它最终在另一端是相同的服务器和必须提供所有数据的相同数据存储,因此在最少的单独请求中最少的往返可能是最好的。

    但是,其中一些取决于目标主机的规模和架构,因此需要进行实验以了解实际效果最佳。

    【讨论】:

    • 我可以发送一个带有非常大的pageSize 值的请求,它会返回所有内容,但这需要很长时间。服务器似乎以这样一种方式配置,即发送多个较小的请求要快得多。我希望避免使用循环并等待查看响应何时为空(数据结束),因为这违背了并行化的目的,但看起来这可能不是一个选择......
    猜你喜欢
    • 2012-06-25
    • 2019-08-08
    • 2019-04-14
    • 2020-04-16
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2013-05-04
    相关资源
    最近更新 更多