当观看集合上的更改流时,我可以指定一个简历令牌(使用resumeAfter)来在opslog中的该令牌之后进行更改。如果在opslog中找不到此令牌(例如,客户端断开连接太长并提供旧令牌),会发生什么?
特别是,异步mongodb java驱动程序会检测到这种情况吗?
对我来说,这个问题很重要,因为我必须检测,我是否丢失了连接并且必须再次提取所有数据,或者可以依赖更改流来从集合中获取所有更改。
只要oplog有足够的历史记录来定位应用程序收到的最后一个操作,就可以恢复流的可恢复性。
但没有说明,否则会发生什么。我还发现很难读取驱动程序source,以确定客户端如何检测是否可以在opslog中找到最后一个令牌。
答案 0 :(得分:1)
如果在oplog
中找不到此令牌会发生什么
正如评论中所提到的,这种行为发生在MongoDB服务器中。当客户端(即使用Java驱动程序编写的应用程序)提交resumeToken
时,服务器将验证令牌。另请参阅resume_token.cpp (v3.7.0)
服务器发现的任何错误都将被抛回客户端,然后客户端将引发异常。在MongoDB Java driver的情况下,它将是com.mongodb.MongoCommandException
。
如果担心掉落OpLog,我建议相应地计算replica set oplog大小并结合恢复令牌的缓存周期。例如。如果OpLog可以存储长达24小时的操作,则可以每8-12小时缓存一次恢复令牌。