Microsoft.Azure.Cosmos.ChangeFeedProcessor.StopAsync是否在返回之前等待任何处理完成?

oxcyiej7  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(108)

当停止CosmosDB ChangeFeedProcessor时,StopAsync方法在返回之前是否等待任何正在进行的更改处理(在ChangeFeedProcessor中)完成?换句话说,当StopAsync完成时,我们是否确定没有ChangeFeedProcessor正在运行或计划运行?
另外,如果处理正在进行中,调用StopAsync是否会设置ChangeFeedCheckCancellationToken?
最后,在ChangeFeedProcessor中,处理CancellationToken的最佳方法是什么,以确保任何已处理的文档都不会再次处理,同时确保在重新启动CangeFeedProcessor时重新发送剩余的文档进行处理?
我的目标是确保如果服务器正常停止,然后重新启动,没有更改会丢失,也没有更改会被处理两次。
注意:StopAsync文档没有说明任何内容...

vtwuwzda

vtwuwzda1#

StopAsync向负载均衡器(抓取新租约)和控制器发出信号,通知它们应该停止并等待,直到动态处理完成。它还向每个租约的续订器和处理器发出信号。这一切都是通过CancellationToken信令(与ChangeFeedToken接收的CancellationToken相同)完成的。
然而,这可能并不意味着当前批更改完成了处理,它仍然可能由于例如在XML代码中的异常而失败。
参考文献:

  • 处理器:https://github.com/Azure/azure-cosmos-dotnet-v3/blob/9175f51fa500ebd5e91196359680891bfd913be0/Microsoft.Azure.Cosmos/src/ChangeFeedProcessor/ChangeFeedProcessorCore.cs#L68
  • 负载均衡器:https://github.com/Azure/azure-cosmos-dotnet-v3/blob/9175f51fa500ebd5e91196359680891bfd913be0/Microsoft.Azure.Cosmos/src/ChangeFeedProcessor/FeedManagement/PartitionLoadBalancerCore.cs#L61
  • 控制器:https://github.com/Azure/azure-cosmos-dotnet-v3/blob/9175f51fa500ebd5e91196359680891bfd913be0/Microsoft.Azure.Cosmos/src/ChangeFeedProcessor/FeedManagement/PartitionControllerCore.cs#L96
  • 更新器和处理器:https://github.com/Azure/azure-cosmos-dotnet-v3/blob/9175f51fa500ebd5e91196359680891bfd913be0/Microsoft.Azure.Cosmos/src/ChangeFeedProcessor/FeedManagement/PartitionSupervisorCore.cs#L38-L42

没有变化,我们将被处理两次
这是不可能的。更换饲料处理器有“至少一次”的保证,而不是“只有一次保证”。
因此,即使这种情况(停止)将确保完成所有的飞行中处理,仍然会有可能存在相同事件的双重交付或双重处理的情况。

相关问题