[英]Get resume token with MongoDB Java driver before first document received in ChangeStream?
这个问题类似于How do I resume a MongoDB ChangeStream at the first document 并且不仅在我开始收听之后发生变化,而且对于 Java 驱动程序也发生了变化。 这是至关重要的,afaik,如果需要确保所有文档至少处理一次。
例如,假设我有一个更改 stream (C) 订阅文档并根据每个文档的内容发送 email。 但是,如果 email 发送失败或服务器在 email 可以发送之前崩溃,则恢复令牌 (R) 将不会被持久化。 当应用程序再次启动时,它将在没有恢复令牌的情况下“观看”,因此将丢失文档并且不会发送 email。
是否有一种受支持的方法可以在收到第一个更改文档之前获取ChangeStream的恢复令牌以缓解上述问题?
从MongoDB 规范中我可以看出,这必须由驱动程序支持:
驱动程序必须公开一种机制来检索将用于自动恢复的相同恢复令牌。
但我似乎找不到使用 Java API 的方法。 这是可能的还是有推荐的解决方法?
请注意,我非常不希望使用基于时间戳的startAtOperationTime
,因为时间很脆弱,并且服务器和客户端上的时钟都可能更改。
在实现规范的“必须公开恢复令牌”规定的 4.2 兼容驱动程序中,每次更改 stream 执行 getMore 时,都会发生以下两种情况之一:
正如我在 Java 中记得的那样,更改流有一个 tryNext 方法,您需要调用它来检索 postBatchResumeToken 而不会阻塞应用程序。 检索当前恢复令牌(与文档或 postBatchResumeToken 关联的令牌)的机制是特定于驱动程序的。
https://mongodb.github.io/mongo-java-driver/4.0/apidocs/mongodb-driver-sync/com/mongodb/client/MongoChangeStreamCursor.html is the closest documentation I can find, except I believe you would use tryNext而不是下一个,如果 tryNext 没有返回任何文档,您仍然会阅读当前的恢复令牌以在更改 stream 中推进您的 position。
https://docs.mongodb.com/ruby-driver/master/tutorials/ruby-driver-change-streams/#resuming-a-change-stream 通常可能对恢复令牌跟踪有所帮助,尽管这没有帮助根据需要包括 try_next(Ruby 驱动程序也实现)。
这将允许您在收到任何文件之前正确恢复更改 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ。 您将在处理文档后存储恢复令牌,因此您需要足够快地取得进展,以免掉出 oplog,但 postBatchResumeToken 处理长时间没有任何更改而不会掉出 oplog 的情况。
You still need to start the change stream at a timestamp in the very beginning, if you do not have any resume tokens - https://mongodb.github.io/mongo-java-driver/4.0/apidocs/mongodb-driver-sync /com/mongodb/client/ChangeStreamIterable.html提供 startAtOperationTime 作为我希望您使用的方法。 如果您的驱动程序公开了它,您可能会提供驱动程序跟踪的当前 clusterTime。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.