给定一个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)服务计划上。
答案 0 :(得分:3)
我认为有一个可能的原因可能导致您的快速反应迟钝。
删除异步操作太多,这会在短时间内创建大量回调I / O事件。 Node.js可能首先服务于这些事件,并阻止Node.js处理其他传入的HTTP请求。
您是否可以使用async.eachLimit而不是async.each来设置较低的并发限制?