当停止CosmosDB ChangeFeedProcessor时,StopAsync方法在返回之前是否等待任何正在进行的更改处理(在ChangeFeedProcessor中)完成?换句话说,当StopAsync完成时,我们是否确定没有ChangeFeedProcessor正在运行或计划运行?
另外,如果处理正在进行中,调用StopAsync是否会设置ChangeFeedCheckCancellationToken?
最后,在ChangeFeedProcessor中,处理CancellationToken的最佳方法是什么,以确保任何已处理的文档都不会再次处理,同时确保在重新启动CangeFeedProcessor时重新发送剩余的文档进行处理?
我的目标是确保如果服务器正常停止,然后重新启动,没有更改会丢失,也没有更改会被处理两次。
注意:StopAsync文档没有说明任何内容...
1条答案
按热度按时间vtwuwzda1#
StopAsync向负载均衡器(抓取新租约)和控制器发出信号,通知它们应该停止并等待,直到动态处理完成。它还向每个租约的续订器和处理器发出信号。这一切都是通过CancellationToken信令(与ChangeFeedToken接收的CancellationToken相同)完成的。
然而,这可能并不意味着当前批更改完成了处理,它仍然可能由于例如在XML代码中的异常而失败。
参考文献:
没有变化,我们将被处理两次
这是不可能的。更换饲料处理器有“至少一次”的保证,而不是“只有一次保证”。
因此,即使这种情况(停止)将确保完成所有的飞行中处理,仍然会有可能存在相同事件的双重交付或双重处理的情况。