1

从 MongoDB 中发生操作到我在 NodeJS 的更改流中捕获它,我遇到了 5 到 10 秒的延迟。

这些时间是否正常,我可以检查哪些参数以查看是否有影响?

这里有几个例子和一些怀疑(待测试)。

这里我们尝试只捕获我们感兴趣的Users集合的字段中的更改,我不知道这样做是否会避免不需要的事件可能会导致ChangeStream的接收延迟并且接收更多事件和过滤器会很方便在代码中更新的字段。

我不知道,如果操作类型的“和”必须放在前面,或者它是不相关的,我也不知道。

userChangeStreamQuery: [{
    $match: {
        $and: [
            {$or:[
                { "updateDescription.updatedFields.name": { $exists: true } },
                { "updateDescription.updatedFields.email": { $exists: true } },
                { "updateDescription.updatedFields.organization": { $exists: true } },
                { "updateDescription.updatedFields.displayName": { $exists: true } },
                { "updateDescription.updatedFields.image": { $exists: true } },
                { "updateDescription.updatedFields.organizationName": { $exists: true } },
                { "updateDescription.updatedFields.locationName": { $exists: true } }
            ]},
            { operationType: "update" }]
    }
}],

在另一个等待计划集合上的事件中,我担心它没有定义聚合,并且在接收到事件时,如果操作到达类型“插入”、“更新”、“删除”,它会被过滤. 这给了我们 7~10 秒的延迟。

startChangeStream({
    streamId: 'plans',
    collection: 'plans',
    query: '',
    resumeTokens
});
...
const startChangeStream = ({ streamId, collection, query, resumeTokens }) => {

    const resumeToken = resumeTokens ? resumeTokens[streamId] || undefined : undefined;

    nativeMongoDbFactory.setChangeStream({
        streamId,
        collection,
        query,
        resumeToken
    });
}

在任何情况下都不是海量操作,通常是用户通过 Web 表单执行的操作。

4

1 回答 1

1

当集合分片时,mongos服务器需要等待所有分片有数据返回,如果一些分片没有数据写入,空闲的主mongod每10(idlewriteperiodms)秒向oplog写入一个no-op。这就是为什么你延迟是 7~10 秒。

于 2021-12-22T02:13:12.367 回答