删除 azure blob 块列表 express/nodejs

Deleting a list of azure blobs blocks express/nodejs

给定一个 blob 列表,我想一个一个地删除它们(因为在 azure storage sdk 中没有 batch/bulk 删除 blob)而不阻塞节点的事件循环或快速服务器。删除由请求触发(并在请求上运行)。但是,尽管整个流程尽可能异步,但一旦删除开始,Express 服务器就会变得无响应,有时某些端点会返回 500。

const async       = require('async');
const azure       = require('azure-storage');
const Promise     = require('bluebird');

const blobService = azure.createBlobService(CONFIG.CONNECTION_STRING);

// Endpoint
app.delete(`${BASE_URL}/files/:date`, deleteFiles);

const deleteFiles = async (req, res) => {

  const date = req.params.date;

  if (!date) {

    return res.status(400).send();

  }

  await deleteBlobs(date).catch((err) => {

    return res.status(500).send(err);

  });

  res.status(200).send();

};

const deleteBlobs = (date) => {

  return new Promise(async (resolve, reject) => {

    // findFiles calls blobService.listBlobsSegmentedWithPrefix and performs some async.map on the returned entrieds
    const blobNames = await findFiles(date)
      .catch(err => log.error('findFiles failed in deleteBlobs.', err));

    async.each(
      blobNames,
      (blobName, callback) => {

        blobService.deleteBlob(CONTAINER, blobName, (deleteError) => {

          if (deleteError) {

            return callback(deleteError);

          }

          callback();

        });

      },
      err => {

        if (err)  {

          return reject(err);

        }

        resolve();

      });

  });

};

那我错过了什么?为什么服务器在删除完成之前没有响应?

提及(可能有帮助):Express server/app 托管在 Azure 的基本 (B1) 服务计划中。

我认为有 1 个可能的原因会导致您的快递无响应。

删除异步操作过多,短时间内会产生大量回调 I/O 事件。 Node.js 可能首先服务于这些事件,然后卡住 Node.js 来处理其他传入的 HTTP 请求。

您可以使用 async.eachLimit 而不是 async.each 来设置较低的并发限制吗?

http://caolan.github.io/async/docs.html#eachLimit