我正在尝试使用Node.js在Azure 函数中向我的Azure 存储队列添加大约 6000 条消息。
我尝试了多种方法来做到这一点,现在我将
QueueService 方法包装在 a 中,并使用Bluebird以大约 50 的并发性Promise
通过 a 解决 6000 个承诺。Promise.map
const addMessages = Promise.map(messages, (msg) => {
//returns a promise wrapping the Azure QueueService method
return myQueueService.addMessage(msg);
}, { concurrency: 50 });
//this returns a promise that resolves when all promises have resolved.
//it rejects when one of the promises have rejected.
addMessages.then((results) => {
console.log("SUCCESS");
}, (error) => {
console.log("ERROR");
});
我的 QueueService 是使用ExponentialRetry
策略创建的。
使用这种策略我得到了好坏参半的结果:
- 所有消息都被添加到我的队列中,并且承诺正确解决。
- 所有消息都被添加到我的队列中,并且承诺没有解决(或拒绝)。
- 并非所有消息都添加到我的队列中,并且承诺不会解决(或拒绝)。
我是否遗漏了什么,或者我的电话有时需要 2 分钟才能解决,有时需要 10 分钟以上?
将来,我可能要添加大约 100.000 条消息,所以我有点担心我现在得到的不可预测的结果。
在节点(在 Azure 函数中)添加大量消息的最佳策略是什么?
编辑:
不知道我是怎么错过的,但是将消息添加到我的存储队列的一种非常可靠的方法是使用我的 Azure 函数的队列输出绑定:
也使我的代码更容易!
for (var i = 0; i < messages.length; i++) {
// add each message to queue
context.bindings.outputQueue.push(messages[i]);
}
编辑2:
我打算将我的消息分成大约 1000 条,并将这些批次存储在Azure Blob Storage中。
每次添加新 blob 时都可以触发另一个 Azure 函数,该函数将一次处理 1000 条消息的排队。
这应该使我的队列更加可靠和可扩展,因为我尝试通过输出绑定将 20.000 条消息添加到我的队列中,并在 5 分钟后收到 Azure 函数超时,而只能处理大约 15.000 条消息。