当 mongodb 更改流的恢复令牌已过时时,java 驱动程序的行为是什么?
What is the java driver behaviour, when the resume token for mongodb change streams is outdated?
在集合上观察更改流时,我可以指定一个恢复令牌(使用 resumeAfter)以获取操作日志中该令牌之后的更改。如果在 opslog 中找不到此令牌,会发生什么情况(例如,客户端断开连接的时间过长并提供了旧令牌)?
特别是异步 mongodb java 驱动程序会检测到这种情况吗?
对我来说,这个问题很重要,因为我必须检测我是否丢失了连接并必须再次提取所有数据,或者可以依赖变更流从集合中获取所有更改。
documentation 指出,
Change streams are resumable, as long as the oplog has enough history to locate the last operation that the application received.
但没有具体说明,否则会发生什么。我还发现很难阅读驱动程序 source,以确定客户端如何检测是否可以在 opslog 中找到最后一个标记。
What happens if this token cannot be found in the oplog
如评论中所述,此行为发生在 MongoDB 服务器中。当客户端(即使用 Java 驱动程序编写的应用程序)提交 resumeToken
时,服务器将验证令牌。另见 resume_token.cpp (v3.7.0)
服务器发现的任何错误都将返回给客户端,然后客户端将引发异常。在 MongoDB Java driver 的情况下,它将是 com.mongodb.MongoCommandException
。
如果担心 OpLog 脱落,我建议结合恢复令牌的缓存期相应地计算 replica set oplog 大小。例如。如果 OpLog 最多可以存储 24 小时的操作,则可以每 8-12 小时缓存一次恢复令牌。
在集合上观察更改流时,我可以指定一个恢复令牌(使用 resumeAfter)以获取操作日志中该令牌之后的更改。如果在 opslog 中找不到此令牌,会发生什么情况(例如,客户端断开连接的时间过长并提供了旧令牌)?
特别是异步 mongodb java 驱动程序会检测到这种情况吗?
对我来说,这个问题很重要,因为我必须检测我是否丢失了连接并必须再次提取所有数据,或者可以依赖变更流从集合中获取所有更改。
documentation 指出,
Change streams are resumable, as long as the oplog has enough history to locate the last operation that the application received.
但没有具体说明,否则会发生什么。我还发现很难阅读驱动程序 source,以确定客户端如何检测是否可以在 opslog 中找到最后一个标记。
What happens if this token cannot be found in the oplog
如评论中所述,此行为发生在 MongoDB 服务器中。当客户端(即使用 Java 驱动程序编写的应用程序)提交 resumeToken
时,服务器将验证令牌。另见 resume_token.cpp (v3.7.0)
服务器发现的任何错误都将返回给客户端,然后客户端将引发异常。在 MongoDB Java driver 的情况下,它将是 com.mongodb.MongoCommandException
。
如果担心 OpLog 脱落,我建议结合恢复令牌的缓存期相应地计算 replica set oplog 大小。例如。如果 OpLog 最多可以存储 24 小时的操作,则可以每 8-12 小时缓存一次恢复令牌。