我正在使用带有Azure Function App的documentDB。我在JS中创建了一个基本的HTTPtrigger,用于在documentDB中存储(插入)条目。
收集的数据吞吐量设置为2500(RU)。
这里req.body是一个数组,req.body.length大约有2500个对象,大小为1 MB,我相信它相当小。
module.exports = function (context, req) {
context.bindings.document = [];
if (req.body) {
//if(req.body instanceof Array){context.log("It is an array");}
context.bindings.document = req.body; // here document is function app parameter
res = {status: 200};
}
else {
res = {
status: 400,
body: "Pass Parameters"
};
}
context.done(null, res);};
对于功能应用程序的每个单一请求(POST),它需要大约30-40秒才能执行并在集合中存储值,这非常长。并且它会导致并行请求的连接超时。
是否有任何性能调整可用于documentDB或Azure功能应用程序以缩短执行时间?
Function App如何在后台处理documentDB?它是否采用最佳实践?
我熟悉其他NoSQL中的批量插入/更新操作,但无法找到documentDB的任何内容。
答案 0 :(得分:1)
我们的输出绑定是枚举您提供给我们的文档数组并逐个插入文档 。对于大多数情况来说这很好,但如果您有可能不适合您的高级批量导入要求。
DocumentDB客户端API通常不支持批量插入操作,但是可以通过编写服务器端存储过程(例如here)来逐个完成。虽然Azure函数通常不能使用该存储过程方法,但如果您需要,您可以自己使用DocumentDB客户端SDK来执行此操作。
您可能会探索的另一个选项是在http函数中获取初始数组输入并将其分解为较小的文档组,将这些文档推送到导入Azure队列(使用我们的队列绑定文档here)。然后,您可以拥有一个监视该队列的单独函数,并使用上面的输出绑定来导入这些较小的文档集。队列还可以扩展 - 多个文档集将以并行导入。