Azure Cosmos DB MongoDB API变更流可靠性及使用问题咨询
应用开发场景
- 基于ASP.NET Core 3.1开发Web应用
- 数据存储采用Azure Cosmos DB(3.6版本)的MongoDB API兼容能力
- 核心需求为对托管集合的变更进行跟踪与响应,因此选用Azure Cosmos DB提供的变更流(Change Feed)能力
- 当前负载情况:集合单条记录的更新频率约为每秒10次
- 测试阶段实现:通过代码将捕获到的变更条目写入本地文件做验证,核心实现代码如下:
private async Task HandleChangeStreamAsync<T>(IMongoCollection<T> coll, StreamWriter file, CancellationToken cancellationToken = default) { var pipeline = new EmptyPipelineDefinition<ChangeStreamDocument<T>>() .Match(change => change.OperationType == ChangeStreamOperationType.Insert || change.OperationType == ChangeStreamOperationType.Update || change.OperationType == ChangeStreamOperationType.Replace) .AppendStage<ChangeStreamDocument<T>, ChangeStreamDocument<T>, ChangeStreamOutputWrapper<T>>( "{ $project: { '_id': 1, 'fullDocument': 1, 'ns': 1, 'documentKey': 1 } }"); var options = new ChangeStreamOptions { FullDocument = ChangeStreamFullDocumentOption.UpdateLookup }; using (var cursor = await coll.WatchAsync(pipeline, options, cancellationToken)) { await cursor.ForEachAsync(async change => { var json = change.fullDocument.ToJson(new JsonWriterSettings { Indent = true }); await file.WriteLineAsync(json); }, cancellationToken); } }
观测异常
对比相同逻辑在MongoDB Cloud托管实例上的运行输出,可确认Azure Cosmos DB侧的变更流并未对集合的每一次更新都触发事件,存在事件遗漏。
待咨询核心问题
- Azure Cosmos DB的MongoDB API对变更流的支持可靠性如何?
- 该API能否保证所有最新的更新事件始终可以被正常获取?
- 用户无法自主操作
local数据库下的oplog.rs集合,Azure Cosmos DB的MongoDB API是否支持对该集合的直接读写?是否推荐采用直接操作oplog的方式实现变更跟踪? - 集合配置的吞吐量(RU/s)与变更事件的处理频率是否存在关联?
提问者的初步判断与延伸疑问
- 初步推断:频繁更新会触发系统限流,变更流不会完整处理日志中的所有事件,而是以周期性扫描的方式运行;核心顾虑为无法确认该机制的可靠程度,能否保证不遗漏任何关键的数据库更新。
- 延伸判断:如果变更流无法对事件处理频率做出稳定保证,且不存在操作
oplog.rs的可行路径,只能选择对数据库做周期性轮询的方案;但提问者认为轮询方案会大幅影响性能,且导致整体方案不具备可扩展性,需要验证该判断是否正确。
内容的提问来源于stack exchange,提问作者ivanpovazan
相关产品推荐
相关产品推荐

