这个问题类似于我如何在第一个文档中恢复MongoDB ChangeStream,不仅是在开始侦听后发生更改,还包括Java驱动程序。afaik,如果需要确保所有文档至少被处理一次,这一点至关重要。
例如,假设我有一个变更流(C),用于订阅文档并根据每个文档的内容发送电子邮件。但是,如果电子邮件发送失败或服务器在发送电子邮件之前崩溃了,则恢复令牌(R)将不会保留。再次启动该应用程序时,它将“监视”没有简历令牌,因此该文档将丢失并且不会发送电子邮件。
是否有一种受支持的方法可以在收到第一个变更文档之前获取ChangeStream的恢复令牌,以减轻上述问题?
从MongoDB规范可以看出,驱动程序必须支持这一点:
驱动程序必须公开一种机制来检索将用于自动恢复的相同恢复令牌。
但是我似乎找不到使用Java API做到这一点的方法。这可能吗?还是有建议的解决方法?
请注意,由于时间易碎,并且服务器和客户端上的时钟都可能更改,因此我非常希望不要使用startAtOperationTime
基于时间戳的时钟。
在实现规范的“必须公开恢复令牌”规定的与4.2兼容的驱动程序中,每次更改流执行getMore时,都会发生以下两种情况之一:
我记得在Java中,变更流具有tryNext方法,您需要调用该方法来检索postBatchResumeToken而不阻塞应用程序。检索当前恢复令牌(与文档关联的一个令牌或postBatchResumeToken的机制)是特定于驱动程序的。
https://mongodb.github.io/mongo-java-driver/4.0/apidocs/mongodb-driver-sync/com/mongodb/client/MongoChangeStreamCursor.html是我能找到的最接近的文档,除了我相信您会使用tryNext而不是next,并且如果tryNext不返回任何文档,您仍将读取当前的简历令牌以提高您在更改流中的位置。
就恢复令牌令牌跟踪而言,https://docs.mongodb.com/ruby-driver/master/tutorials/ruby-driver-change-streams/#resuming-a-change-stream可能会有所帮助,尽管这通常不会根据需要包括try_next(Ruby驱动程序也实现)。
这样一来,您就可以在更改流收到任何文档之前正确地对其进行恢复。您将在处理文档后存储恢复令牌,因此您需要足够快地取得进展,以确保不脱离oplog,但是postBatchResumeToken处理很长时间没有任何变化而不会脱离oplog的情况。
如果您没有任何恢复令牌,您仍然需要从头开始在时间戳记上开始更改流-https: //mongodb.github.io/mongo-java-driver/4.0/apidocs/mongodb-driver-sync /com/mongodb/client/ChangeStreamIterable.html将startAtOperationTime用作我希望您使用的方法。如果您的驱动程序公开了当前的clusterTime,则可能会提供它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句