如果有人問你CAP理論是什麼,就把這篇文章發給他。

来源:https://www.cnblogs.com/fishlynn/archive/2018/08/30/9558280.html
-Advertisement-
Play Games

絕對和你在網上看到的CAP定理介紹不一樣。 CAP 定理(CAP theorem)又被稱作布魯爾定理(Brewer's theorem),是加州大學伯克利分校的電腦科學家埃里克·布魯爾(Eric Brewer)在 2000 年的 ACM PODC 上提出的一個猜想。2002 年,麻省理工學院的賽斯 ...


絕對和你在網上看到的CAP定理介紹不一樣。

CAP 定理(CAP theorem)又被稱作布魯爾定理(Brewer's theorem),是加州大學伯克利分校的電腦科學家埃里克·布魯爾(Eric Brewer)在 2000 年的 ACM PODC 上提出的一個猜想。2002 年,麻省理工學院的賽斯·吉爾伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)發表了布魯爾猜想的證明,使之成為分散式計算領域公認的一個定理。

對於設計分散式系統的架構師來說,CAP 是必須掌握的理論。

為了更好地解釋 CAP 理論,我特意去大佬的博客看了下,作為參考基礎。

http://robertgreiner.com/about

 

Robert Greiner 對 CAP 的理解也經歷了一個過程,他寫了兩篇文章來闡述 CAP 理論,第一篇被標記為“outdated”(網上絕大部分解鎖都止於第一篇)

我們先看下第一版和第二版的差異

 

第一版

Any distributed system cannot guaranty C, A, and P simultaneously.

對於一個分散式計算系統,不可能同時滿足一致性(Consistence)、可用性(Availability)、分區容錯性(Partition Tolerance)三個設計約束。

1. 一致性(Consistency)

All nodes see the same data at the same time.

所有節點在同一時刻都能看到相同的數據。

2. 可用性(Availability)

Every request gets a response on success/failure.

每個請求都能得到成功或者失敗的響應。

3. 分區容忍性(Partition Tolerance)

System continues to work despite message loss or partial failure.

出現消息丟失或者分區錯誤時系統能夠繼續運行。

第二版

In a distributed system (a collection of interconnected nodes that share data.), you can only have two out of the following three guarantees across a write/read pair: Consistency, Availability, and Partition Tolerance - one of them must be sacrificed.

在一個分散式系統(指互相連接並共用數據的節點的集合)中,當涉及讀寫操作時,只能保證一致性(Consistence)、可用性(Availability)、分區容錯性(Partition Tolerance)三者中的兩個,另外一個必須被犧牲。

1. 一致性(Consistency)

A read is guaranteed to return the most recent write for a given client.

對某個指定的客戶端來說,讀操作保證能夠返回最新的寫操作結果。

2. 可用性(Availability)

A non-failing node will return a reasonable response within a reasonable amount of time (no error or timeout).

非故障的節點在合理的時間內返回合理的響應(不是錯誤和超時的響應)。

3. 分區容忍性(Partition Tolerance)

System continues to work despite message loss or partial failure.

當出現網路分區後,系統能夠繼續“履行職責”。

 

我們來詳細看下具體的差異

首先概念上第二版定義了什麼才是 CAP 理論探討的分散式系統,強調了兩點:interconnected 和 share data,為何要強調這兩點呢? 因為分散式系統並不一定會互聯和共用數據。最簡單的例如 Memcache 的集群,相互之間就沒有連接和共用數據,因此 Memcache 集群這類分散式系統就不符合 CAP 理論探討的對象;而 MySQL 集群就是互聯和進行數據複製的,因此是 CAP 理論探討的對象。

第二版強調了 write/read pair,這點其實是和上一個差異點一脈相承的。也就是說,CAP 關註的是對數據的讀寫操作,而不是分散式系統的所有功能。例如,ZooKeeper 的選舉機制就不是 CAP 探討的對象。

1. 一致性(Consistency)

第一版強調同一時刻擁有相同數據(same time + same data),第二版並沒有強調這點。

因此第一版的解釋“All nodes see the same data at the same time”是不嚴謹的。而第二版強調 client 讀操作能夠獲取最新的寫結果就沒有問題,因為事務在執行過程中,client 是無法讀取到未提交的數據的,只有等到事務提交後,client 才能讀取到事務寫入的數據,而如果事務失敗則會進行回滾,client 也不會讀取到事務中間寫入的數據。

2. 可用性(Availability)

第一版的 success/failure 的定義太泛了,幾乎任何情況,無論是否符合 CAP 理論,我們都可以說請求成功和失敗,因為超時也算失敗、錯誤也算失敗、異常也算失敗、結果不正確也算失敗;即使是成功的響應,也不一定是正確的。例如,本來應該返回 100,但實際上返回了 90,這就是成功的響應,但並沒有得到正確的結果。相比之下,第二版的解釋明確了不能超時、不能出錯,結果是合理的,

3. 分區容忍性(Partition Tolerance)

第一版用的是 work,第二版用的是 function。

work 強調“運行”,只要系統不宕機,我們都可以說系統在 work,返回錯誤也是 work,拒絕服務也是 work;而 function 強調“發揮作用”“履行職責”,這點和可用性是一脈相承的。也就是說,只有返回 reasonable response 才是 function。相比之下,第二版解釋更加明確。

 

雖然 CAP 理論定義是三個要素中只能取兩個,但放到分散式環境下來思考,我們會發現必須選擇 P(分區容忍)要素,因為網路本身無法做到 100% 可靠,有可能出故障,所以分區是一個必然的現象。如果我們選擇了 CA 而放棄了 P,那麼當發生分區現象時,為了保證 C,系統需要禁止寫入,當有寫入請求時,系統返回 error(例如,當前系統不允許寫入),這又和 A 衝突了,因為 A 要求返回 no error 和 no timeout。因此,分散式系統理論上不可能選擇 CA 架構,只能選擇 CP 或者 AP 架構

 

1.CP - Consistency/Partition Tolerance

如下圖所示,為了保證一致性,當發生分區現象後, 節點1上的數據無法同步到 節點2, 節點2上的數據還是 Y。這時客戶端 C 訪問 節點2時,節點2 需要返回 Error,提示客戶端 “系統現在發生了錯誤”,這種處理方式違背了可用性(Availability)的要求,因此 CAP 三者只能滿足 CP。

2.AP - Availability/Partition Tolerance

如下圖所示,為了保證可用性,當發生分區現象後, 節點1上的數據無法同步到 節點2, 節點2上的數據還是 Y。這時客戶端 訪問 節點2 時,節點2 將當前自己擁有的數據 Y 返回給客戶端,而實際上當前最新的數據已經是 X了,這就不滿足一致性(Consistency)的要求了,因此 CAP 三者只能滿足 AP。

 

 如果你看到了這裡,那拿出手機掃一掃,關註我,一起成長! (不定期送書哦)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • XML定義:可擴展標記語言。 html與xml區別: XML被設計為傳輸和存儲數據,其焦點是數據的內容。 html被設計用來顯示數據,其焦點是數據的外觀。 html所有標簽都是預先定義好的。 xml當中的標簽都是自己定義的。 XML用處 數據存儲,配置文件,數據傳輸 文檔聲明: 必需寫在文檔的第一行 ...
  • 註意:這篇文章最初發表在我自己折騰的博客站點上:javascript閉包的使用--按鈕切換,該博客用了一位前輩開源的源碼,基於thinkjs和vuejs開發,歡迎大家來逛逛。 閉包實現按鈕狀態切換看下麵的代碼: 解釋上面的代碼實現了點擊按鈕切換樣式的功能,它用到了js的閉包特性。簡單解釋下:togg ...
  • 作者:Neal_yang github.com/Nealyang/YOU-SHOULD-KNOW-JS/blob/master/doc/basic_js/JavaScript中的跨域總結.md 前端開發中,跨域使我們經常遇到的一個問題,也是面試中經常被問到的一些問題,所以,這裡,我們做個總結。小小問 ...
  • 作者: SlaneYang https://segmentfault.com/a/1190000011966867 前言 作為戰鬥在業務一線的前端,要想少加班,就要想辦法提高工作效率。這裡提一個小點,我們在業務開發過程中,經常會重覆用到日期格式化、url參數轉對象、瀏覽器類型判斷、節流函數等一類函數 ...
  • <a></a>超鏈接標簽: a標簽有個target屬性,<a href="#" target = "_self">在當前選項卡中進行跳轉,也就是不建立新頁面。target的預設屬性就是_self。 target="_blank"用於在新的選項卡中跳轉,也就是新建一個頁面。 也可以設置<base> t ...
  • 實例: 錯誤(無法顯示出分頁器按鈕,此功能不適用與for迴圈出來的圖片,只有當該頁面圖片固定幾張時能正常用) 第一步: 安裝 npm i swiper (vue插件自帶) 第二步: 在當前頁面里引入 第三步:當然吶,或許你在想內容吶,別急,為了大家的方便內容的寫法我也會提供 <html代碼> <di ...
  • 前言 mui是一款接近原生App體驗的前端框架,只需要掌握前端技術就可以開發APP應用,官方有提供功能比較全面的demo版本, 但在實戰中總會遇到一些不可避免但坑,對於沒有接觸過mui的開發者,難免會浪費很多時間在踩坑上。 該項目以mui為開發框架,artTemplate.js作為js模版引擎,沒有 ...
  • 官網 http://www.fhadmin.org/ 系統介紹: 1.網站後臺採用主流的 SSM 框架 jsp JSTL,網站後臺採用freemaker靜態化模版引擎生成html 2.因為是生成的html,所以訪問速度快,輕便,對伺服器負擔小 3.網站前端採用主流的響應式佈局,同一頁面同時支持PC、 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...