摘要:沖突的處理,也是分布式系統中一個重要的議題。假設負責整理新聞段子有個人王尼瑪張全蛋紙巾。第二天,張全蛋復查列表,由于紙巾的更新操作并不是在他之后的而是和他同時的,這時候就產生了一個沖突,需要處理。
沖突的處理,也是分布式系統中一個重要的議題。今天我們繼續以 Riak 為案例,看看 Riak 是怎么做沖突處理的。
Vector Clock(向量鐘)Riak 通過一種叫做 Vector Clock 的機制來處理沖突問題。簡單來說,Vector Clock 是一段 token,
像 Riak 這樣的分布式系統通過這樣的 token 來追蹤數據更新操作的先后順序。
在沖突處理中,能夠知道沖突操作(eg. 創建操作,更改操作)的順序,是非常重要的。
因為對于分布式系統來說,不同的客戶端連接到的是不同的服務器節點,
當一個客戶端更新了一個服務器節點上的數據,也許另一個客戶端也同時更新了另一個服務器節點上的數據。
這時候,也許你會想到:記錄每個操作的時間戳,然后依照時間戳靠后的操作來。然而要這么做的話,這里有個隱含的前提:
在這個分布式系統中的每個服務器節點,時鐘都必須是完全同步的。
然而事實上,一方面這是非常困難的:需要非常大的財力物力的投入;另一方面,整個系統又是單點故障的。
所以,Riak 使用 Vector Clocks 來處理沖突。Vector Clocks 給每個寫操作(創建,更改,刪除) 打上一個標簽,標簽代表了是哪個客戶端以什么樣的順序執行的操作。
這樣一來,客戶端或者開發者就能決定面對沖突,該怎么決定。
如果你熟悉像 Git, Subversion這樣的版本控制系統,
這就和兩個人同時修改了同一個文件產生的沖突解決思路是相似的。
暴走大事件的編輯部每周都要整理下一期里要播報的新聞段子。
假設負責整理新聞段子有3個人:王尼瑪(A), 張全蛋(B), 紙巾(C)。他們需要確定最終的新聞段子的列表。新聞段子的列表存儲在分布式的服務器中。
每個人用自己的終端連接數據庫。這些終端都有著唯一的標識,用來構建 vector clock。下面就讓我們模擬一下,vector clock 是如何工作的。
首先,王尼瑪用自己的終端更新了列表
vclock: A[0] value: ["news xx"]
然后,張全蛋先下載了這個列表,然后更新了這個列表
vclock: A[0], B[0] value: ["news xx", "news xyy"]
張全蛋更新的同時(王尼瑪做更新之后),紙巾同樣的下載了已有的列表,做了更新。
vclock: A[0], C[0] value: ["news xx", "news yyz"]
第二天,張全蛋復查列表,由于紙巾的更新操作并不是在他之后的(而是和他同時的),
這時候就產生了一個沖突,需要處理。
他拿到兩個值:
vclock: A[0], B[0] value: ["news xx", "news xyy"] -- vclock: A[0], C[0] value: ["news xx", "news yyz"]
他需要解決這個沖突:于是他選擇合并這兩個值:
vclock: A[0], C[0], B[1] value: ["news xx", "news xyy", "news yyz"]
這樣一來,任何人之后獲取到的就是這個最新的合并后的值了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17457.html
摘要:具體代碼執行方式進入到的目錄下,命令行運行即可。確保為一個對象如果對象下有則不需要再次生成函數返回該對象的實例,這里判斷了如果該對象下已經有實例,則直接返回,不再去生產實例。這就確保了一個對象下的實例僅被實例化一次。 看這篇之前,如果沒有看過之前的文章,可拉到文章末尾查看之前的文章。 回顧 在 step4 中,我們大致實現了一個 MVVM 的框架,由3個部分組成: defineRe...
摘要:有向無環圖,以下簡稱是其中的代表之一。的去中心化和可擴展性可認為是一體兩面的,因為基于數據結構帶來的異步記賬特性,同時實現了高度的參與網絡節點的去中心化和交易的可擴展性。因此,目前對于雙花問題,需要綜合考慮實際情況進行設計。 本報告由火幣區塊鏈研究院出品,作者:袁煜明、胡智威。原文地址 相關報告: 【超越白皮書2】EOS主網上線前夕的實測分析與技術建議 【超越白皮書1】EOSIO程序實...
摘要:經過幾天的努力,用已經實現了一個完整的基礎計算器,如下圖上代碼定義整數類型描述定義操作符號類型描述加法定義操作符號類型描述減法定義操作符號類型描述乘法定義操作符號類型描述除法定義操作符號類型描述定義操作符號類型描述定義空格用來存儲輸入字符的 showImg(https://segmentfault.com/img/bVbdNO5?w=900&h=377); 經過幾天的努力,用PHP已經...
閱讀 3192·2021-11-23 10:09
閱讀 2057·2021-10-26 09:51
閱讀 975·2021-10-09 09:44
閱讀 3898·2021-10-08 10:04
閱讀 2742·2021-09-22 15:14
閱讀 3619·2021-09-22 15:02
閱讀 1035·2021-08-24 10:03
閱讀 1719·2019-12-27 12:14