azure-functions - CosmosDBTrigger 可靠地处理每个文档一次?
问题描述
我的客户想使用 CosmosDBTrigger 将文档传输到 Azure 服务总线。在这种情况下,在 Cosmos 项突变和服务总线消息之间建立 1:1 的关系很重要。因此,触发器接收的每个文档(通过批处理)必须只处理一次,这导致了一些我无法确认的基本问题:
- 如果代码在处理过程中抛出异常会发生什么?批次会被遗忘吗?
- 同样,如果函数服务或 CosmosDBTrigger 库在调用 Azure 函数之前存在运行时问题,是否可以在不跳过批处理或复制文档的情况下恢复?
- 函数有没有办法上报完成状态,比如“未处理”;导致触发器重试批处理?
- 是否存在相同或不同实例将多次处理同一文档的情况?(我读过几篇声称发生了这种情况的帖子。)
如果最终答案是这个触发器不可靠,只是好奇它的预期用例是什么?
谢谢
-约翰
解决方案
简短的回答是否定的。Cosmos DB 触发器具有“至少一次”交付,这意味着在某些情况下,可以多次交付项目。
- 根据下面的链接(并与其他基于事件的 Azure Functions 触发器保持一致),未处理的异常不会导致批处理重试。函数团队有一个设计建议,让所有基于事件的触发器都有一个重试配置(https://github.com/jeffhollan/retry-design),一旦应用,你就可以定义一个重试策略对于 Cosmos DB 触发器也是如此。
- 如果运行时问题在您的函数代码中的任何点停止当前批处理,当运行时再次启动时,它将重试整个批处理,无法知道您读取或处理批处理中的哪个点,因为 Function 用户代码是私有的。完整执行函数后,租赁存储上的函数检查点的生命周期,如果运行时在中间停止(因为您手动停止了它或由于某些事件停止了运行时),则检查点没有发生,并且租赁商店具有先前的标记。
- 如前所述,基于事件的触发器没有重试行为,因此您无法根据某些条件重试。
- 是的,如前所述,触发器具有“至少一次”交付。如果实例数量由于扩展事件而发生变化,则可以再次处理相同的文档,其中触发器将重新平衡新实例之间的租约。
如需参考,请参阅故障排除指南:https ://docs.microsoft.com/azure/cosmos-db/troubleshoot-changefeed-functions 。
推荐阅读
- javascript - Javascript/Angular 下载方式只下载 1kb
- azure - Azure IoT Central - 一个设备中的多个主题路径
- python - Numpy - 对矩阵的第一行和第一列求和
- sql - 这两个模型在实现数据库和约束时有什么区别吗?
- python - 如何根据前几年更改学生的历史年级水平?
- p-value - 当我通过 stat_pvalue_manual 在多面板上添加 pvalue 时,我遇到了错误美学必须是长度 1 或与数据相同 (4):填充
- elasticsearch - Elasticsearch 6.0.1 版中的突出显示行为
- c++ - 使用非常量变量作为 constexpr 数组的索引以传递给模板参数
- python - 为什么我们将串行对象传递给函数?
- javascript - 如何在 Yarn PnP 模式下使用 Rollup+Babel 转译依赖的 js 文件?