当前位置: 首页 > 知识库问答 >
问题:

Azure Cosmos DB的API对MongoDB的变更流支持有多可靠?

丌官博文
2023-03-14

为了跟踪对集合所做的更改,我用下面的代码将受影响的条目转储到一个文件中(这只是为了测试目的)。

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云托管的数据库进行比较来确认这一点。

>

  • Azure Cosmos DB的API对MongoDB的变更流支持有多可靠?

    如果更改提要支持不能保证事件处理频率,并且无法处理'oplog.rs',那么唯一的选择似乎是定期轮询数据库。

    如果我错了,请纠正我,但是切换到轮询将极大地影响性能,并将导致一个不可伸缩的解决方案。

  • 共有1个答案

    郑哲彦
    2023-03-14

    我怀疑MongoDB变更流是建立在Cosmos DB变更提要上的。我的经验完全是使用Cosmos DB更改提要;我根本没有使用MongoDB API。所以这个答案完全是假设MongoDB变更流内部使用Cosmos DB变更提要,这是有道理的,但我可能错了。

    Azure Cosmos DB的API对MongoDB的变更流支持有多可靠?

    它是完全可靠的,但有一些限制。

    API能保证最新的更新总是可用的吗?

    在代码从更改提要中检索文档后,文档总是有可能发生更改,在这种情况下,更新后的文档将重新发布到更改提要中,代码很快就会再次看到它。当然,不能保证您的代码刚刚从变更提要中获得的文档与数据库中的文档是相同的,但最终会保持一致。

    我不能自己处理'local'数据库的'oplog.rs'集合,API以任何方式支持这一点吗?这甚至被鼓励了吗?

    这是正确的。

    然而,我想知道依赖这种机制是否安全,并确保不要错过对数据库进行的任何关键更新。

    代码将始终(最终)接收更新的文档。但是,如果需要单独查看每个更改,则需要使用类似事件源的方法来构造数据结构。如果您的应用程序只关心文档的最终状态,那么更改提要就可以了。但是,例如,如果您需要知道SomeCriticalProperty是否被设置为true,然后返回到false,那么您将需要事件源。

     类似资料:
    • 问题内容: 我正在这样写我的文档测试: 这对于Python 2.5、2.6和2.7版本可以正常工作,但对于Python 3则失败,并出现以下错误: 问题是,如果我这样编写我的doctest: 它们仅适用于Python3,而在Python2版本上无效。我的问题是如何使其跨版本兼容? 问题答案: 我在IPython中遇到了与doctests相同的问题。没有整洁的解决方案,但是我将所有前缀都包装在中,即

    • 我有不同的客户使用不同的数据库服务器(postgres,oracle,mysql等) 我想写我的代码一次,并能够在不同的数据库运行。 实现这一点的“Mybatis”方法是什么? null 我正在使用mybatis java注释。

    • 我目前正在研究一个MongoDB支持的RESTFUL API与烧瓶...但是,Ive使用find_one()设置了一个区域搜索查询,但是一旦我尝试使用find()将其设置为具有多个结果的较大查询,我就在postman上收到以下错误: 这是有效的代码,但它只从查询中返回一个文档: 一旦我尝试更改以获得所有结果,使其查找()它不起作用 ps.我是编程界的新手,所以如果你能使用简单的例子,我会非常感激。

    • 安装设置 Docusaurus 支持用 TypeScript 编写的主题组件。要开始使用 TypeScript,请在项目中添加 @docusaurus/module-type-aliases 以及一些 @types 依赖项: npm Yarn npm install --save-dev typescript @docusaurus/module-type-aliases @types/react

    • 其他流式框架(如Apache Samza、Storm或Nifi)是否可以实现这一点? 我们非常期待得到答复。

    • 搜索之后,我发现了两个有趣的答案: > 对 javaFX 的本机映像格式支持 使用javaFX控制gif图像 但是正如我所看到的,javaFX不支持APNG图像。如何使用任何外部库或编写一些代码来解决此问题。我需要一个解决方案... 谢谢你的帮助。