繁体   English   中英

在 ChangeStream 中收到第一个文档之前,使用 MongoDB Java 驱动程序获取恢复令牌?

[英]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 时,都会发生以下两种情况之一:

  • 至少返回一个文档,每个文档都包含该文档的简历标记,或者
  • 不返回任何文档,在这种情况下 postBatchResumeToken 仍由 4.0.7+ 服务器提供。

正如我在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM