【发布时间】:2020-03-25 17:29:50
【问题描述】:
我正在构建一个持久函数,它会定期处理我的 Cosmos DB 中的每条记录(晚上和周末)。现在我只有几百条记录,但一旦投入生产,我预计会收到超过 50k 的文档,每周添加约 1k。
我通过activityTrigger 获取文件,绑定如下:
{
"bindings": [
{
"name": "name",
"type": "activityTrigger",
"direction": "in"
},
{
"type": "cosmosDB",
"direction": "in",
"name": "articles",
"databaseName": "Arts",
"collectionName": "ArtData",
"connectionStringSetting": "CosmosTrigger_ConnectionString",
"sqlQuery": "SELECT * FROM c WHERE c.type='article'"
}
],
"scriptFile": "../dist/GetAllArticleData/index.js"
}
通过 SQL 查询绑定返回给 Azure 函数的文档总数是否有限制?还是 Azure Functions 自动处理分页,没有上限?
如果没有内置分页,如何将持久函数链接在一起,第一个活动获取总行数,然后调用扇出/输入查询函数,其中 OFFSET 和 LIMIT 子句是从协调器?这是一个可靠的模式吗?
【问题讨论】:
-
没有真正的限制,您只需要继续传递继续令牌,直到您耗尽查询。但我有更大的担忧。如果您的分区键是类型,那么如果您继续向此容器添加数据,您最终将达到 20GB 的限制。如果 type 不是分区键,那么您将运行一个非常昂贵的查询,随着时间的推移将继续变得更加昂贵。另外,为什么要批量运行它。 Cosmos + Azure Functions 更适合流式更新。与每周进行一次批量更新相比,IT 更经济且可扩展,可随手更新。
-
感谢您的评论。使用 JavaScript 绑定,我根本不处理 Cosmos 上下文。我只是将文档作为函数上下文的属性。我根本无权访问延续令牌。我想知道 Azure 函数是否会自动为我处理延续。至于分区键,是另外一回事,所以不用担心20GB的限制。
-
至于为什么要批处理?我正在使用持久功能扇出/输入来处理批处理(我有另一个处理更改馈送的功能)来执行一些依赖于数据顺序的业务逻辑。我不控制数据传入的顺序,因此处理所有事情的最佳方法是定期通过业务逻辑运行所有内容。我需要处理所有内容,因为从现在开始的几周内出现的数据可能与去年处理的数据有关。这就是为什么我会在晚上/周末运行它。如果运行需要 8 小时,那就这样吧。没有其他人在使用该系统。
标签: azure-functions azure-cosmosdb