node.js - MongoDB中的changeStream和tailable游标有什么区别

标签 node.js mongodb mongoose mongodb-query

我正在尝试确定变更流之间的区别: https://docs.mongodb.com/manual/changeStreams 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/

看起来像这样:

 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

他们有不同的用例吗?什么时候最好使用一个而不是另一个?

最佳答案

Change Streams (在 MongoDB v3.6+ 中可用)是一项功能,允许您访问实时数据更改,而不会出现拖尾 oplog 的复杂性和风险。 .变更流超过跟踪 oplog 的主要好处是:

  1. 利用内置的MongoDB Role-Based Access Control .应用程序只能针对它们具有 read 访问权限的集合打开更改流。细化和特定的授权。

  2. 提供定义明确且可靠的 API。 change events变更流返回的输出有据可查。此外,所有 official MongoDB drivers跟随相同specifications在实现变更流接口(interface)时。

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

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

  5. 由于排序特性,变更流本质上也是可恢复的。 change event output_id是一个简历 token 。 MongoDB官方驱动会自动缓存这个resume token,在网络 transient 错误的情况下驱动会重试一次。此外,应用程序还可以通过使用参数 resume_after 手动恢复。另见 Resume a Change Stream .

  6. 使用 MongoDB aggregation pipeline .应用程序可以修改更改事件输出。目前有五个管道阶段可用于修改事件输出。例如,更改事件输出可以在使用 $match stage 发送出去之前被过滤掉(服务器端)。 .见 Modify Change Stream Output了解更多信息。

when would it be good to use one over the other?

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

您还可以找到 Change Streams Production Recommendations有用的资源。

关于node.js - MongoDB中的changeStream和tailable游标有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49343303/

相关文章:

node.js - 如何从 node.js 将大数据集转储到 mongodb 中

mongodb - 访问 Mongoose 父文档以获取子文档中的默认值

node.js - Electron CustomScheme - 各种特权意味着什么?

ruby-on-rails - 在服务器(Node.js 和 Rails)和客户端上运行 Backbone 进行复杂验证是否明智?

json - 如何使用node js同步读取sqlite3数据库?

javascript - mongodb 日期时间过滤和聚合

mongodb - mongodb中的最大值和最小值

node.js - 无法让 AWS lambda 等待异步请求调用完成

java - 在 MongoDB 中定义和检索键值

javascript - 服务器发现和监控引擎已弃用