CosmosDBTrigger 可靠地处理每个文档一次?

CosmosDBTrigger reliably processing each document exactly once?

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

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

谢谢

-约翰

简短的回答是否定的。 Cosmos DB 触发器有一个 "at least once" 交付,这意味着在某些情况下,可以多次交付一个项目。

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

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