首页 > 解决方案 > CosmosDBTrigger 可靠地处理每个文档一次?

问题描述

我的客户想使用 CosmosDBTrigger 将文档传输到 Azure 服务总线。在这种情况下,在 Cosmos 项突变和服务总线消息之间建立 1:1 的关系很重要。因此,触发器接收的每个文档(通过批处理)必须只处理一次,这导致了一些我无法确认的基本问题:

如果最终答案是这个触发器不可靠,只是好奇它的预期用例是什么?

谢谢

-约翰

标签: azure-functionsazure-cosmosdbazure-triggersazure-cosmosdb-changefeedcosmosdbtrigger

解决方案


简短的回答是否定的。Cosmos DB 触发器具有“至少一次”交付,这意味着在某些情况下,可以多次交付项目。

  1. 根据下面的链接(并与其他基于事件的 Azure Functions 触发器保持一致),未处理的异常不会导致批处理重试。函数团队有一个设计建议,让所有基于事件的触发器都有一个重试配置(https://github.com/jeffhollan/retry-design),一旦应用,你就可以定义一个重试策略对于 Cosmos DB 触发器也是如此。
  2. 如果运行时问题在您的函数代码中的任何点停止当前批处理,当运行时再次启动时,它将重试整个批处理,无法知道您读取或处理批处理中的哪个点,因为 Function 用户代码是私有的。完整执行函数后,租赁存储上的函数检查点的生命周期,如果运行时在中间停止(因为您手动停止了它或由于某些事件停止了运行时),则检查点没有发生,并且租赁商店具有先前的标记。
  3. 如前所述,基于事件的触发器没有重试行为,因此您无法根据某些条件重试。
  4. 是的,如前所述,触发器具有“至少一次”交付。如果实例数量由于扩展事件而发生变化,则可以再次处理相同的文档,其中触发器将重新平衡新实例之间的租约。

如需参考,请参阅故障排除指南:https ://docs.microsoft.com/azure/cosmos-db/troubleshoot-changefeed-functions 。


推荐阅读