簡體   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