删除azure blobs块列表express / nodejs

时间:2018-02-01 14:10:31

标签: node.js azure express azure-storage async.js

给定一个blob列表,我想逐个删除它们(因为没有阻塞节点的事件循环或快速服务器,因此在azure存储sdk中没有批量/批量删除blob)。删除由请求触发(并在其上运行)。但是尽管整个流程尽可能不同步,但一旦删除开始,快速服务器就会无响应,有时一些端点会返回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();

      });

  });

};

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

提及(可能有帮助):快速服务器/应用程序在Azure上托管在基本(B1)服务计划上。

1 个答案:

答案 0 :(得分:3)

我认为有一个可能的原因可能导致您的快速反应迟钝。

删除异步操作太多,这会在短时间内创建大量回调I / O事件。 Node.js可能首先服务于这些事件,并阻止Node.js处理其他传入的HTTP请求。

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

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