【问题标题】:What is the difference between a changeStream and tailable cursor in MongoDBMongoDB中的changeStream和tailable游标有什么区别
【发布时间】:2018-08-26 20:27:33
【问题描述】:

我正在尝试确定变更流之间的区别: 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

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

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    Change Streams(在 MongoDB v3.6+ 中可用)是一项功能,可让您访问实时数据更改,而无需担心oplog 的复杂性和风险。变更流超过跟踪 oplog 的主要好处是:

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

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

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

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

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

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

    什么时候最好使用一个而不是另一个?

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

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

    【讨论】:

    • 不错的答案,谢谢,需要多读几遍才能吸收所有信息
    • 感谢您的详细回答。第 3 点、第 4 点和第 5 点使 MongoDB 支持真正的分布式响应队列。
    【解决方案2】:

    使用可尾光标,您可以跟踪所有集合的所有更改。使用 changeStream,您只能看到所选集合的更改。流量更少,更可靠。

    【讨论】:

      猜你喜欢
      • 2010-09-09
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多