1

我一直在閱讀Nathan Marz的'article關於如何用Lambda架構擊敗CAP定理,並不明白不變數據如何使最終一致性更簡單。不可變數據如何使最終一致性變得微不足道?

以下段落從文章採取:

的關鍵在於數據是不可變的。不可變的數據意味着沒有更新這樣的事情,所以一塊數據的不同副本不可能變得不一致。這意味着沒有發散值,矢量時鐘或讀取修復。從查詢的角度來看,一段數據存在或不存在。數據上只有數據和功能。你不需要做任何事情來強化最終的一致性,最終的一致性不會妨礙系統的推理。

想象一下下面的例子:我有一個分佈式插入數據庫,它有兩個節點A和B,兩者都保存記錄[timestamp=1; id=1; value=10]。然後與此同時,針對節點A的插入導致[timestamp=2; id=1; value=20]以及針對節點B的讀取以用於記錄id=1

與具有更新可能性的數據庫相比,如何解決與該示例相比最終一致性問題更簡單的問題?

回答

0

我不是100%我說得對,但我會盡力解釋。

考慮一個例子 - 您有2個數據庫接受寫入/讀取,與網絡鏈接相連。鏈接關閉,導致網絡分區。我們希望我們的系統可用CAP,所以我們接受兩個數據庫中的寫入/讀取。

使用可變數據結構時:假設連接到第1個數據庫的客戶端想要將記錄X的值更新爲A,並且連接到第2個數據庫的另一個客戶端想要將該值更新爲B.由於我們系統可用,我們同時接受兩個數據庫中的寫入,但是一旦網絡部分消失,我們將不得不解決衝突。這將導致其中一個更新丟失。

對於不可變的數據結構,您不會更新數據,而是插入數據,因此在網絡分區消失後,兩個寫入都會在那裏。儘管如此,您仍然需要某種時間同步,以保持操作順序,這可能非常棘手(請參閱Sebastien Diot的文章中的評論)。