MongoDB 中的changeStream 和tailable 游标有什么区别

2024-01-04

我试图确定变更流之间的区别:https://docs.mongodb.com/manual/changeStreams https://docs.mongodb.com/manual/changeStreams https://docs.mongodb.com/manual/reference/method/db.collection.watch/ https://docs.mongodb.com/manual/reference/method/db.collection.watch/

看起来像这样:

const changeStream = collection.watch();
changeStream.next(function(err, next) {
  expect(err).to.equal(null);
  client.close();
  done();
});

和一个可尾游标:https://docs.mongodb.com/manual/core/tailable-cursors/ https://docs.mongodb.com/manual/core/tailable-cursors/

看起来像这样:

 const cursor = coll.find(self.query || query)
  .addCursorFlag('tailable', true)
  .addCursorFlag('awaitData', true)  // true or false?
  .addCursorFlag('noCursorTimeout', true)
  .addCursorFlag('oplogReplay', true)
  .setCursorOption('numberOfRetries', Number.MAX_VALUE)
  .setCursorOption('tailableRetryInterval', 200);


 const strm = cursor.stream();   // Node.js transform stream

他们有不同的用例吗?什么时候使用其中一种比较好?


改变流 https://docs.mongodb.com/manual/changeStreams(在 MongoDB v3.6+ 中提供)是一项功能,允许您访问实时数据更改,而无需跟踪数据的复杂性和风险oplog https://docs.mongodb.com/manual/reference/glossary/#term-oplog。变革流的主要好处over拖尾 oplog 是:

  1. 利用内置的MongoDB 基于角色的访问控制 https://docs.mongodb.com/manual/core/authorization/。应用程序只能针对其拥有的集合打开更改流read进入。授权精细化、具体化。

  2. 提供定义良好且可靠的 API。这改变事件 https://docs.mongodb.com/manual/reference/change-events/变更流返回的输出有详细记录。另外,所有的官方 MongoDB 驱动程序 https://docs.mongodb.com/ecosystem/drivers/遵循相同的规格 https://github.com/mongodb/specifications/blob/master/source/change-streams.rst在实现变更流接口时。

  3. 作为更改流的一部分返回的更改事件至少会提交给大多数副本集。这意味着发送到客户端的更改事件是持久的。应用程序不需要在故障转移时处理数据回滚。

  4. 利用全局逻辑时钟提供跨分片更改的总排序。 MongoDB 确保保留更改的顺序,并且可以按照收到的顺序安全地解释更改事件。例如,针对 3 分片分片集群打开的更改流游标会返回与所有三个分片中这些更改的总顺序相关的更改事件。

  5. 由于排序特性,变更流本质上也是可恢复的。这_id of 改变事件输出 https://docs.mongodb.com/manual/reference/change-events/#change-stream-output是一个简历令牌。 MongoDB 官方驱动程序会自动缓存此恢复令牌,并且在网络瞬时错误的情况下驱动程序将重试一次。此外,应用程序还可以通过使用参数手动恢复resume_after。也可以看看恢复变更流 https://docs.mongodb.com/manual/changeStreams/#resume-a-change-stream.

  6. Utilise MongoDB 聚合管道 https://docs.mongodb.com/manual/core/aggregation-pipeline/。应用程序可以修改更改事件输出。目前有五个管道阶段可用于修改事件输出。例如,更改事件输出可以在发送之前被过滤掉(服务器端)$比赛阶段 https://docs.mongodb.com/manual/reference/operator/aggregation/match/#pipe._S_match. See 修改更改流输出 https://docs.mongodb.com/manual/changeStreams/#modify-change-stream-output了解更多信息。

什么时候使用其中一种比较好?

如果您的 MongoDB 部署是版本 3.6+,我建议使用 MongoDB Change Streams 而不是跟踪 oplog。

您可能还会发现更改流生产建议 https://docs.mongodb.com/manual/administration/change-streams-production-recommendations/一个有用的资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB 中的changeStream 和tailable 游标有什么区别 的相关文章

随机推荐