0

在查看集合上的更改流时,我可以指定一个恢复令牌(使用 resumeAfter)来获取 opslog 中该令牌之后的更改。如果在 opslog 中找不到此令牌(例如,客户端断开连接时间过长并提供旧令牌),会发生什么情况?

特别是,异步 mongodb java 驱动程序会检测到这种情况吗?如何检测?

对我来说,这个问题很重要,因为我必须检测我是否丢失了连接并且必须再次提取所有数据,或者可以依靠更改流从集合中获取所有更改。

文件指出,

只要 oplog 有足够的历史记录来定位应用程序收到的最后一个操作,更改流是可恢复的。

但没有具体说明,否则会发生什么。我还发现阅读驱动程序源代码来确定客户端如何检测是否可以在 opslog 中找到最后一个令牌相当困难。

4

1 回答 1

1

如果在 oplog 中找不到这个 token 会发生什么

正如评论中提到的,这种行为发生在 MongoDB 服务器中。当客户端(即使用 Java 驱动程序编写的应用程序)提交resumeToken时,服务器将验证令牌。另请参阅resume_token.cpp (v3.7.0)

服务器发现的任何错误都将被抛回客户端,然后客户端将引发异常。对于MongoDB Java 驱动程序,它将是com.mongodb.MongoCommandException.

如果担心从 OpLog 脱落,我建议结合恢复令牌的缓存周期相应地计算副本集 oplog大小。例如。如果 OpLog 最多可以存储 24 小时的操作,则可以每 8-12 小时缓存一次恢复令牌。

于 2018-06-12T09:08:09.447 回答