MongoDB更改流中resumeAfter和StartOperationTime之间的差异

MongoDB更改流中resumeAfter和StartOperationTime之间的差异,mongodb,changestream,Mongodb,Changestream,对于版本4,MongoDB变更流可以使用两个不同的参数来指定恢复变更流的位置:resumeAfter(一些内部令牌)和时间戳类型StartOperationTime 是否可以使用每个更改事件中的clusterTime将resumeAfter完全替换为StartOperationTime,以安全恢复更改流 我特别关心的是,在文档中找不到确切信息的地方是,对于startAtOperationTime来说,相同的规则和保证是否适用于可以恢复的内容以及恢复的时间。此处使用的操作时间是否正确保存,是否可以

对于版本4,MongoDB变更流可以使用两个不同的参数来指定恢复变更流的位置:
resumeAfter
(一些内部令牌)和时间戳类型
StartOperationTime

是否可以使用每个更改事件中的
clusterTime
resumeAfter
完全替换为
StartOperationTime
,以安全恢复更改流

我特别关心的是,在文档中找不到确切信息的地方是,对于
startAtOperationTime
来说,相同的规则和保证是否适用于可以恢复的内容以及恢复的时间。此处使用的操作时间是否正确保存,是否可以始终用作通常用于
resumeafth
的文档令牌的替换

此处使用的操作时间是否正确持久,是否可以始终用作通常用于resumeAfter的文档令牌的替换

使用这两个选项中的哪一个取决于您的用例

这两个选项与
startAtOperationTime
非常相似,但有细微的区别:

  • startAtOperationTime
    带有时间戳。而
    resumeAfter
    则获取事件文档的整个
    \u id
  • startAtOperationTime
    可以通过创建新的更改流,在更改后恢复通知。而
    resumeAfter
    在失效事件关闭更改流后,无法恢复更改流
  • startAtOperationTime
    恢复在指定时间戳时或之后发生的更改。而
    resumeAfter
    在提供的令牌之后立即更改
无论您选择哪一个,令牌或时间戳都应该在窗口时间内。更改流依赖于MongoDB全局逻辑时钟(群集时间),该时钟与分布式
oplog
同步,因此两个选项都使用相同的底层技术

值得注意的是,如果要开始监视集合并处理集合中的现有条目,可以使用构造的时间戳指定
startAtOperationTime
。使用
resumeAfter
更难做到这一点,因为它需要一个源于事件的
\u id
的令牌

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


您还可能发现MongoDB版本中有用的

是“resumeAfter与StartOperationTime互斥”。这意味着你要么用一个,要么用另一个,但决不能两者都用。另外*“变更流的起始点。如果指定的起始点在过去,则它必须在oplog的时间范围内。要检查oplog的时间范围,请参阅
rs.printplicationinfo()
”。所以本质上是任何东西,只要它在当前的oplog范围内。不知道还有什么可以回答的。@NeilLunn谢谢你的解释。我知道它们是相互排斥的,但我不知道对于可以恢复的内容是否适用相同的保证。我会更新这个问题,让它更清楚。它可能并不突出,但我在
之间的评论中给你的实际上是手册页面上的一段引文,并链接了。这两种形式都不能保证。您要求的是当前在oplog中的内容,或者不是,因此建议您直接在文档中说明“检查时间范围”。好的,换一种说法:使用这两种方法中的一种(例如考虑时钟偏移或类似的影响)正确恢复的几率是否更高.谢谢你的详细解释。这终于澄清了我的问题。如果在官方文件中也能看到这样详细的解释,那就太好了。