停止 CosmosDB ChangeFeedProcessor 时,StopAsync 方法是否会等待任何正在进行的更改处理(在 ChangeFeedHandler 中)完成后再返回?换句话说,当 StopAsync 完成时,我们确定没有 ChangeFeedHandler 正在运行或计划运行吗?
此外,如果处理正在进行,调用 StopAsync 是否会设置 ChangeFeedHandler CancellationToken?
最后,在 ChangeFeedHandler 中,处理 CancellationToken 的最佳方法是什么,以确保不会再次处理任何已处理的文档,同时确保在 CangeFeedProcessor 重新启动时重新发送剩余文档进行处理?
我的目标是确保如果服务器正常停止,然后重新启动,则不会丢失任何更改,并且我们不会处理两次更改。
注意:StopAsync 文档没有说明任何内容...
StopAsync 向负载均衡器(获取新租约)和控制器发出信号,指示它们应该停止并等待,直到进行中的处理完成。它还向每个租约的更新者和处理者发出信号。这一切都是通过 CancellationToken 信号完成的(与您的 ChangeFeedHandler 接收的 CancellationToken 相同)。
但这可能并不意味着当前批次的更改已完成处理,它仍然可能因处理程序代码中的异常等原因而失败。
参考资料:
没有任何改变,我们会被处理两次
这是不可能的。 Change Feed Processor 有“至少一次”保证,而不是“仅一次保证”。
因此,即使这种情况(停止)可以确保完成所有飞行中的处理,仍然存在同一事件的双重交付或双重处理的情况。