描述
我正在开发一个 ASP.NET Core 3.1 Web 应用程序,该应用程序需要跟踪/响应对 Azure Cosmos DB(版本 3.6)托管的 MongoDB 数据库所做的更改。为此,我使用了Change feed support。
更改非常频繁:集合中的单个条目每秒更新约 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 的 MongoDB API 中的更改流支持有多可靠?
API 能否保证最新的更新始终可用?
我无法自己处理“本地”数据库的“oplog.rs”集合,API 是否以任何方式支持这一点?这甚至受到鼓励吗?
收集吞吐量 (RU/s) 是否以某种方式与更改事件频率相关?
最后的想法
我的理解是频繁的更新会限制系统,并且更改源根本无法处理日志中的所有事件(而是定期扫描它)。但是,我想知道依靠这种机制有多安全,并确保不会错过对数据库进行的任何关键更新。如果更改提要支持无法对事件处理频率做出任何保证并且无法处理“oplog.rs”,则唯一的选择似乎是定期轮询数据库。
如果我错了,请纠正我,但切换到轮询会极大地影响性能,并会导致解决方案不可扩展。