Promise.all завершается с ошибкой, если более 1000 запросов https

#node.js #promise

#node.js #обещание

Вопрос:

Я пытаюсь измерить производительность моего приложения node, которое в основном выполняет количество запросов GET.

Чтобы оценить производительность, я решил использовать набор данных размером 1 миллион. Но это не удается после 1000 запросов.

Мой код выглядит примерно так:

 let promiseArray = [] 
for(let i = 0; i < 10001; i  ) {
  promiseArray.push(
    new Promise((resolve, reject) => {
      https.get("https://google.com", (response, err) => {
        if (err) reject(err);
        let bodyChunks = [];
        response
          .on("data", chunks => {
            bodyChunks.push(chunks);
          })
          .on("end", () => {
            var body = Buffer.concat(bodyChunks);
            resolve(body);
          });
      });
    })
  );
}

fetchData = async () => {
  result = await Promise.all(promiseArray);
  console.log(result);
}

fetchData();
  

Это нормально работает до 1000 запросов, но как только я делаю 1001, это выдает следующую ошибку:

Ошибка: getaddrinfo НЕ НАЙДЕН google.com google.com:443

Я также пытался использовать bluebird Promise.map :

 var foo = Array(10000)
  .fill()
  .map((v, i) => i);

Promise.map(
  foo,
  function(i) {
    // Promise.map awaits for returned promises as well.
    return new Promise((resolve, reject) => {
      https.get("https://google.com", (response, err) => {
        if (err) reject(err);
        let bodyChunks = [];
        response
          .on("data", chunks => {
            bodyChunks.push(chunks);
          })
          .on("end", () => {
            var body = Buffer.concat(bodyChunks);
            resolve(body);
          });
      });
    });
  },
  { concurrency: 100 }
).then(function() {
  console.log("done");
});
  

Это выдало мне ошибку:

Ошибка: ошибка подключения ECONNREFUSED 172.217.194.113:443

Это не работает даже для 10 запросов!

Кто-нибудь может помочь мне разобраться, как выполнить более 1000 запросов, используя Promise.all ()?

Комментарии:

1. Это не Promise.all проблема. это проблема с сетью, вы выполняете больше запросов, чем может обработать ваша сеть, а затем ее не удается устранить.

2. Вам нужно будет отправлять его партиями, лимит каждой партии будет зависеть от операционной системы, аппаратного обеспечения, сети и многих других вещей. Если вы попробуете это на виртуальной машине, оптимизированной для сети, на EC2, вы сможете обработать больше запросов, чем на вашем локальном компьютере.