在版本 4 中,MongoDB 更改流可以使用两个不同的参数来指定恢复更改流的位置:resumeAfter(一些内部标记)和 startAtOperationTime,一种时间戳类型。

是否可以通过使用在每个更改事件中找到的 resumeAfter 来完全用 startAtOperationTime 替换 clusterTime 以安全恢复更改流?

我特别关心的是我在文档中找不到确切信息的地方是 startAtOperationTime 是否有相同的规则和保证适用于可以恢复的内容以及持续多长时间。此处使用的操作时间是否正确持久化,是否可以始终用作通常用于 resumeAfter 的文档 token 的替代品?

最佳答案



使用这两者中的哪一个,取决于您的用例。

resumeAfterstartAtOperationTime 两个选项非常相似,但有细微差别:

  • startAtOperationTime 需要一个时间戳。而 resumeAfter 获取 Change Stream 事件文档的整个 _id
  • startAtOperationTime 可以通过创建新的更改流在 invalidate event 之后恢复通知。虽然 resumeAfter 在无效事件关闭流后无法恢复更改流。
  • startAtOperationTime 恢复 指定时间戳或之后发生的更改。虽然 resumeAfter 在 提供的 token 之后立即恢复更改

  • 无论您选择哪一个, token 或时间戳都应在 Replica Set Oplog 窗口时间内。变更流依赖于与分布式 oplog 同步的 MongoDB 全局逻辑时钟(集群时间),因此任一选项都使用相同的底层技术。

    值得注意的是,如果您想开始观看集合并处理集合中的现有条目,您可以使用构造的时间戳指定 startAtOperationTime。使用 resumeAfter 会更难做到这一点,因为它需要一个源自事件的 _id 的 token 。

    此外,MongoDB v4.2 中新增了一个新选项 startAfter,它从事件中获取 _id,并在恢复 token 中指定的操作后恢复更改流。此外,它允许通知在无效事件之后恢复,就像 startAtOperationTime 一样。

    您可能还会发现 MongoDB 版本上的 compatibility table between resume tokens 很有用

    关于mongodb - MongoDB 更改流中 resumeAfter 和 startAtOperationTime 之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55184492/

    10-11 07:57