2

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

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

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

谢谢

-约翰

4

1 回答 1

2

简短的回答是否定的。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 。

于 2020-05-12T15:59:27.083 回答