假設有一個值為 的 DynamoDB 鍵0,并且有一個使用最終一致讀取從該鍵重復讀取的程序。當這些讀取發生時,第二個行程將該鍵的值設定為1。
讀取程序是否有可能在第一次讀取 a0 之后讀取 a 1?在 DynamoDB 的最終一致性模型中,客戶端是否可以成功讀取密鑰的完全最新值,然后在后續請求中讀取陳舊值?
最終,寫入將被完全傳播,而讀取程序將只讀1取值,但我不確定在傳播發生時讀取是否有可能“及時倒退”。
uj5u.com熱心網友回復:
對的,這是可能的。請求是無狀態的,因此來自同一個客戶端的第二次讀取與任何其他請求一樣可能會看到稍微陳舊的資料。如果這是一個問題,請選擇強一致性。
uj5u.com熱心網友回復:
獲取新資料后,您將永遠無法獲取舊資料..
首先,檔案中沒有關于重復讀取回傳陳舊資料的警告,只是在寫入后讀取可能會回傳陳舊資料。
最終一致的讀取
當您從 DynamoDB 表中讀取資料時,回應可能不會反映最近完成的寫入操作的結果。回應可能包含一些陳舊的資料。如果您在短時間內重復讀取請求,則回應應回傳最新資料。
但更重要的是,DDB 中的每一項都存盤在三個存盤節點中。在將資料寫入 3 個存盤節點中的 2 個之前,對 DDB 的寫入不會回傳 200 - Success。因此,只有當您的讀取由第三個節點提供服務時,您才會看到陳舊的資料。一旦第三個節點更新,每個節點都有最新的。
深入了解Amazon DynamoDB
uj5u.com熱心網友回復:
您正在尋找的屬性稱為單調讀取,例如參見https://jepsen.io/consistency/models/monotonic-reads中的定義。
顯然,DynamoDB 的強一致性讀取 ( ConsistentRead=true) 也是單調的,但是您正確地詢問了 DynamoDB 的最終一致性讀取模式。
@Charles 在他的回復中提供了一個鏈接,https://www.youtube.com/watch?v= yvBR71D0nAQ&t=706s,這是亞馬遜關于最終一致讀取如何作業的一個很好的官方官方演講。該演講解釋說 DynamoDB 將寫入的資料復制到三個副本,但是當三分之二的副本(包括一個被指定為“領導者”的副本)更新時,寫入完成。第三個副本可能需要一些時間(通常需要很短的時間才能更新)。
該視頻繼續解釋了最終一致的讀取隨機訪問三個副本之一。
因此,在第三個副本具有舊資料的短時間內,一個請求可能會隨機轉到其中一個更新的節點并回傳新資料,然后稍晚一點的另一個請求可能會隨機轉到未更新的副本并回傳舊資料資料。這意味著不提供“單調讀取”保證。
總而言之,如果您使用最終一致性讀取,我認為 DynamoDB 不提供單調讀取保證。當然,您可以使用強一致性讀取來獲取它。
不幸的是,我找不到聲稱這一點的官方檔案。在實踐中測驗這一點也很好,類似于他的論文http://www.aifb.kit.edu/images/1/17/How_soon_is_eventual.pdf測驗 Amazon S3(不是 DynamoDB)是否保證單調讀取,以及通過實際看到單調讀取違規發現它并沒有。
在實踐中可能很難看到這些單調讀取違規的實施細節之一是亞馬遜如何處理來自同一行程的請求(你說的是你的情況)。當同一個行程按順序發送多個請求時,它可能(但也可能不會......)可能會使用相同的 HTTP 連接來執行此操作,并且亞馬遜的內部負載均衡器可能(但也可能不會)決定將這些請求發送到相同的后端副本 - 盡管視頻中宣告每個請求都發送到隨機副本。如果發生這種情況,在實踐中可能很難看到單調讀取違規 - 但是如果負載均衡器改變主意,或者客戶端庫打開另一個連接等等,它仍然可能發生,所以你仍然不能相信單調讀取要持有的屬性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425729.html
標籤:数据库 nosql 亚马逊-dynamodb 一致性 最终一致性
