При загрузке корзины GCP не удается подключиться к токену oauth2 при загрузке большого количества изображений - PullRequest
1 голос
/ 16 июня 2020

Я написал функцию загрузки в NodeJS для загрузки изображений в облачное хранилище Google. Функция отлично работает, когда я пытаюсь загрузить от 200 до 400 изображений. Однако я попытался загрузить более крупный набор данных (3000+ изображений), сначала последовательность загрузки кажется нормальной, а затем внезапно возникает ошибка. Когда я смотрю на ведро из облачной консоли Google, мне кажется, что загружены только некоторые изображения.

Я попытался осмотреться, чтобы увидеть, сталкивался ли кто-нибудь с той же проблемой, что и я, но, похоже, я не могу найти подобных случаев. Был бы очень признателен, если бы кто-нибудь мог указать мне в правильном направлении.

Вот мой код для функции загрузки gcp.

const { Storage } = require("@google-cloud/storage");
const gc = require("../config/gcp");

const uploadImages = async (req, pid, folder) => {
  let promises = [];
  const bucket = gc.bucket(pid);

  req.forEach(image => {
    const blob = bucket.file(`${folder}/${image.originalname}`);
    const promise = new Promise((resolve, reject) => {
      // eslint-disable-next-line security/detect-non-literal-fs-filename
      const blobStream = blob.createWriteStream({
        metadata: {
          contentType: image.mimetype,
        },
        resumable: false,
      });

      blobStream
        .on("finish", async () => {
          try {
            await blob.makePublic();
            resolve();
          } catch (error) {
            reject(error);
          }
        })
        .on("error", err => {
          console.log(err.message);
          reject(err);
        })
        .end(image.buffer);
    });
    promises.push(promise);
  });
  return Promise.all(promises)
    .then(() => {
      promises = [];
      console.log("Images Uploaded");
    })
    .catch(err => {
      throw Error(err.message);
    });
};

Вот ошибка, которую я внезапно получил бы посреди последовательности загрузки.

Internal server error: Error: request to https://www.googleapis.com/oauth2/v4/token failed, reason: connect EHOSTUNREACH 74.125.200.95:443

1 Ответ

1 голос
/ 29 июня 2020

Код написан прямо сейчас: вы пытаетесь выполнять все операции загрузки одновременно и параллельно. В какой-то момент с node.js вы достигаете предела активных сетевых подключений, которые вы можете переносить одновременно. Это могло бы произойти, если бы вы делали сетевой запрос к любому сайту, а не только к GCP.

Я бы посоветовал регулировать обещания через асинхронную c очередь, например p-queue . Часто мы пишем тесты для этих библиотек! Я бы начал с ограничения параллелизма до ~ 25 одновременных операций, а затем оттуда go.

...