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



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

  • 如果代码在处理过程中引发异常,会发生什么情况?这批人会被遗忘吗?
  • 同样,如果函数服务或 CosmosDBTrigger 库存在运行时问题,导致在调用 Azure 函数之前中断,是否可以在不跳过批处理或复制文档的情况下恢复此问题?
  • 函数有没有办法报告完成状态,例如"未处理";导致触发器重试批处理?
  • 是否存在由相同或不同实例多次处理同一文档的情况?(我读过几篇声称发生这种情况的帖子。

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

谢谢

-John

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

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

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

最新更新