冰激凌和分散式系統

labazhou發表於2014-10-27

  我們能夠處理好冰激凌的總量嗎?

  在我小時候,我真的喜歡吃冰激凌。它現在還是不錯,只是回到那個時候我對它多少有些狂熱。我父母知道脂肪和糖的美味混合物最好偶爾食用,因此要小心地限制量。當然,我找到了系統中的方法。首先,我找到媽媽,問問是不是可以吃冰激凌了,她將給出答案。如果她不同意,我再去找爸爸問同樣的問題。這個策略增加了獲得同意的機會,因為我父母的決定不是一致的。少數情況下,我甚至能吃到媽媽同意的冰激凌,然後找爸爸嘗試圖吃到第二碗。

  這種詭計持續了一段時間後,我父母明白過來了。他們決定有必要給我提供一致的答案,唯一的方式就是在我詢問吃冰激凌時,他們每次都要彼此溝通一下。他們的協調方法非常有效。它確保了一致性的答案,只不過讓我等待問題答案的時間稍微長了些。

  當我父母上班時,這種方法就不管用了。做為一個孩子,我能夠找到好藉口在任何時候與其中一個家長說話,但是他們的工作會妨礙他們彼此溝通。再一次,我可以把這種情況用在了豐富的、甜甜的、奶油優勢上。由於我父母無法交流,我能夠強迫得到不一致的決定。我父母讓他們做出是否購買冰激凌的一致性決定,卻不能彼此溝通,這是他們的失誤?

假定網路由至少兩個節點組成,這樣網路可以被分為兩個不相交的、非空集合:{G1,G2}。證實的基本思想就是假定G1和G2之間的所有資訊都丟失了。如果G1發生了一個寫操作,隨後G2發生了一個讀操作,那麼讀操作不能返回之前寫操作的結果。

  假定我父母沒有手錶,他們做出的決定只能根據他們收到的資訊和內部狀態,Glibert和Lynch證實了他們通常不能做出一致性的決定。這是關於寫和讀的通常結果。他們在某些特定情況下可以做得更好嗎?

  靈活使用時鐘

  在時間上,我父母的冰激淩策略是我一週得到一碗。他們每天上班之前商量一下,在我還沒有得到每週配額的時候,決定在接下來的八個小時內,只有他們其中一個可以發出冰激凌的決定。如果輪到我媽媽負責,我給爸爸打電話要決定,他就告訴我,他不能給我決定。只要我能夠聯絡到媽媽,我就能得到一致性的答案。如果我不能聯絡到媽媽,我就運氣不佳了。儘管如此,補救措施就是如果媽媽加班,爸爸會注意到超過八個小時了,然後做出決定。

  很快,我這個靈巧的小傢伙,就意識到爸爸的手錶比媽媽的表走得快些。當他到家時,我就去找爸爸要一個香草味兒的。他看看他的手錶,發現八個小時過了,就認為媽媽已經失去了做決定的授權。在檢查了冰箱裡的碗仍然是空著的,以確保媽媽沒有在白天決定,那麼他就讓我吃。我將狼吞虎嚥地吃完,然後給我媽媽打電話。她的手錶告訴她,還沒有過八個小時,她就給我第二碗了。我打敗了這個系統!

[客戶的租約時間]被限額E因為始終偏移縮短了。至少,租約的正確功能只需要始終有一個已知的、有界限的偏移。

  如果我父母讀過Gray和Sheraton,他們將知道如何修復他們的租約協議。我媽媽和爸爸將不得不測出兩個手錶速率之間的偏差,在假定我媽媽不再擁有租約之前,要加上一些時間(E)到我爸爸的時間上。

  把結果彙總

  由於時尚飲食橫掃全國,我父母認為冰激凌沒有他們想象的那樣糟。做為負責任的父母,他們仍然想追蹤我的消費來檢查他們的假設。在工作時間,我媽媽和爸爸退回到了做不一致的決定,每個人只是保持了他們自己同意的頻率的記錄。一旦他們再次回到家裡,他們就累加各自數量,以得到精確的總數。

  追蹤口味有點兒難度。每次我提出一勺子的量,他們都要寫下我被許可的口味。偶爾地,我開啟冰箱發現那種口味沒有了,然後我在打電話請求減少我的總數。由於我是個小孩子,不記事,我記不住媽媽或爸爸是否記錄了“同意”,因此我隨機給其中一人打電話記錄“不同意”。這沒有關係,因為他們仍然能夠累加各自獨立的數量,在一天結束後再彙總出精確的總數。精確的總數,也就是說,直到災難發生才出現。

  我從媽媽那裡收到了吃草莓味冰激凌的許可,但是在製冰盒和冰凍果子之間的普通地方沒有找到。我就回撥過去報告沒找到,但是在我說再見之前電話斷了。由於不能聯絡到媽媽而帶來的焦躁,我向爸爸報告了同樣的情況。當總數在一天結束被彙總出來時,我父母被負的總數搞暈了。我們發明了“負冰激凌”嗎?

  不幸的是,我父母沒有追蹤無衝突複製資料型別的開發。如果他們知道,他們將用OR set解決這個問題,用單標籤(unique tags)追蹤增加和移除。如果被那篇論文武裝了,研究了CRDT新的和舊的,那麼他們就會退回去限制我的配額嗎?意圖很明顯:如果我們能夠獨立計算一些東東,如果我們能夠獨立管理一個set,那麼我們能夠每天獨立地強制同一個碗嗎?非常不幸,做不到。重要的不同在於,增加一個和增加到set是可交換的【注1】,然而如果總數大於零,減少一個就不是可交換的。

  讓每個人同意

  根據他們對於口味追蹤的、令人沮喪的戰爭,我父母讓他們的兼職管家瑪麗協助處理這個問題。在失去對時尚飲食書籍的信任之後,我父母都騰出一部分工作時間去調查冰激凌的健康屬性,也經常改變他們的觀點。他們想仔細地追蹤我吃了多少,尤其是劑量對於我的健康非常重要。媽媽和爸爸決定,只有他們都同意了,瑪麗才能允許我吃一些。瑪麗樂於接受這個任務,但是存在一個大問題:他不喜歡打電話。幸運的是,她喜歡發簡訊。不幸的是,資訊仍然有著奇怪的、昂貴的回覆。

  瑪麗、媽媽和爸爸坐在一起,儘量搞清楚如何用最少的訊息數量來通過這個問題。瑪麗發明了一個簡單的方法:當我問她是否可以吃冰激凌時,她同時給我的爸爸和媽媽發簡訊以徵求他們的意見,在收到瑪麗簡訊之前他們是不會改變意見的。如果他們都同意,她將繼續並讓他們知道她將準備甜點了。如果有一個人說不同意,她將讓他們知道碗裡仍然是空的。這個協議,他們稱之為冰激凌處於凝固和液體階段後面的、二階段提交(Two-phase Commit),需要4條資訊才能完成。瑪麗可以做得更好些,並節約一些簡訊上的花費嗎?

  在不考慮中央處理器故障的情況下,任何提交協議……需要至少 2(N-1)條訊息才能完成一個事務。

  他們比較幸運,我父母沒有浪費太多時間去思考這個問題。瑪麗偶然碰到了Cynthia Dwork和Dale Skeen的論文,它指出了瑪麗需要知道的條件。只要瑪麗傳送簡訊,就沒有比她的協議更好的辦法了。

  • 原文地址:http://brooker.co.za/blog/2014/10/25/ice-cream.html
  • 注1:交換律是被普遍使用的一個數學名詞,意指能改變某物的順序而不改變其最終結果。交換律是大多數數學分支中的基本性質,而且許多的數學證明需要倚靠交換律。簡單運算的交換律許久都被假定存在,且沒有給定其一特定的名稱,直到19世紀,數學家開始形式化數學理論之後。http://zh.wikipedia.org/wiki/交換律
  • 注2:二階段提交(Two-phase Commit)是指,在計算機網路以及資料庫領域內,為了使基於分散式系統架構下的所有節點在進行事務提交時保持一致性而設計的一種演算法(Algorithm)。二階段提交的演算法思路可以概括為: 參與者將操作成敗通知協調者,再由協調者根據所有參與者的反饋情報決定各參與者是否要提交操作還是中止操作。http://zh.wikipedia.org/wiki/二階段提交

  via:labazhou

相關文章