删除 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 来设置较低的并发限制吗?
给定一个 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 来设置较低的并发限制吗?