對CAP原理的理解

来源:https://www.cnblogs.com/xiaoxiongcanguan/archive/2018/11/02/9898060.html
-Advertisement-
Play Games

對CAP原理的理解 CAP原理按照定義,指的是C(Consistency)一致性,A(Availability)可用性,P(Partition tolerance)分區容錯性在一個完整的電腦系統中三種特性不能同時得到完全滿足。 Consistency((強)一致性):指的是在同一時間點,所有的數據 ...


對CAP原理的理解  

  CAP原理按照定義,指的是C(Consistency)一致性,A(Availability)可用性,P(Partition tolerance)分區容錯性在一個完整的電腦系統中三種特性不能同時得到完全滿足。

  Consistency((強)一致性):指的是在同一時間點,所有的數據狀態是否是一致的。對於一致性的理解,個人認為可以從關係型資料庫的事務概念出發來進行理解。例如:一次銀行賬戶的轉賬,雙方賬戶的金額必須同時增加,和減少。不能出現轉賬賬戶已經扣錢,而被轉賬賬戶未能增加金額的情況。

  Availability((高)可用性):顧名思義,指的是電腦系統特別的好用,總是能滿足用戶的需求(接受更多請求,響應更快),用形式化的語言描述就是系統擁有非常高的非故障運行時間百分率。這一特性在如今互聯網時代,海量用戶,大併發請求的場景下對於電腦系統顯得尤為重要,畢竟沒有用戶喜歡一到高峰時期就停止響應的系統。

  Partition tolerance(分區容錯性):指的是在整個系統擁有兩台或以上數量的電腦單元提供服務,當其中部分分區節點故障時,整個系統依然可以向用戶提供可靠的服務。

 

CAP定理告訴我們CAP這三種特性不能同時完全滿足,因此存在以下三種取捨情況: 

  1.選擇CA,放棄P

  通常是由一臺非常強大的電腦對外提供服務來保證A(高可用性),所有的數據操作都在同一臺機器上。在上面提到的銀行賬戶轉賬例子中,在資料庫層面上通過本地事務來輕鬆滿足C((強)一致性)。試想如果此時想要擁有P,即轉賬雙方位於不同分區,那麼一旦被轉賬方出現故障,要麼耗費時間等待其重新開始服務(放棄A);或者暫時僅僅處理轉賬方的業務,等待後續的一致性補償操作(放棄C)。
  該方案的缺點:由於目前科學技術上的限制,無法橫向擴容的系統是無法應付海量請求,大併發的場景的,同時也容易導致單點故障出現,因此這裡的A(高可用性)實際上是大打折扣的。

  2.選擇CP,放棄A

  意味著系統在提供服務時,一旦出現分區故障,為了確保數據的強一致性,所涉及到的服務全部都會停止響應,因此A(高可用性)也就不復存在啦。暫時還沒有想到什麼場景下會採取這種方案。
  該方案的缺點:個人認為低可用性本身就是系統的一大缺點。

  3.選擇AP,放棄C。這種架構可以說是如今互聯網時代最流行的架構。通過分散式和集群進行橫向的系統性能拓展,儘可能的捨棄對數據強一致性的需求,同時在遇到不可避免的分散式事務場景時,大牛們也已經提出了各種各樣的方案來滿足最終的數據一致性((弱)一致性),就不再這裡展開說明瞭。
  該方案的缺點:不適合對數據一致性C((強)一致性)有極高要求的場景,以及不追求A(高可用性)要求的場景(分區總是會帶來額外的麻煩)。
  其實,選擇AP而放棄C的設計理念並不僅僅適用於整個系統的整體架構,例如在系統內部,資料庫集群(可以理解為一個子系統)主從分離的同步延遲造成從庫數據與主庫數據出現數據暫時不一致的情況等等。

  除此之外,CAP中的三個元素也並不是完全的互斥,例如選擇AP,其實也不是徹底的放棄了C(一致性),而是進行了一定程度的讓步,同時C(一致性)也能細分為讀一致性,寫一致性等。因此不能機械的將CAP理論理解為完全互斥,三選二,而是在這三個維度上面進行不同程度的取捨。個人認為CAP理論其實是告訴人們天下沒有免費的午餐,也不存在完美無缺的系統設計,需要反覆的斟酌,權衡,才能設計出合理的,符合需求的系統架構。

  以上是我對CAP原理的一些理解,存在不少誤區,歡迎交流。


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

-Advertisement-
Play Games
更多相關文章
  • 改了一個小項目,裡面有一個小的問題他們是這樣提需求的。兩個輸入框,第一個輸入框裡面,輸入的內容會對第二個輸入框中的內容產生影響。具體是這樣的:如果第一個輸入框中的值不是“0”,那麼第二個輸入框就不能填寫任何的數據,只能預設“0”。只有當第一個輸入框中輸入0的時候,第二個輸入框才是可以輸入的。這個需求 ...
  • 大多數同學在模仿慕課網的時候可能會遇到引入bootstrap和jquery樣式部分失效以及$符號報錯,這裡為大家提供正確的解決方案。 可能大家在引入試過col-md之後覺得bootstrap是ok的,其實這個navbar-inverse不顯示黑色的問題在於bootstrap3.0和4.0之間的更新, ...
  • JavaScript部分 HTML結構部分 CSS部分 ...
  • 轉載請註明出處:https://www.cnblogs.com/Joanna-Yan/p/9894712.html 項目需求:設備採集到的GPS坐標信息,需提供實時、歷史軌跡的查看功能。這些點坐標除經緯度信息外還攜帶了其它的信息,比如:速度、方向、解狀態等。原始的GPS坐標需要轉換成百度地圖/高德地 ...
  • 一、使用字體一般步驟如下 1、下載字體文件,放置到適當位置 2、配置軟體或網頁參數,讓軟體或者網頁能關聯到新的字體 3、在軟體或網頁中使用新字體 二、網頁中如何使用自定義字體 1、下載文字文件,如:BebasNeue-webfont.ttf文件,放到和網頁同一位置 2、用@font-face進行字體 ...
  • el-upload組件預設情況下上傳多少個文件就會請求多少次上傳介面,如何一次上傳多個文件而不必多次請求上傳介面呢?直接看代碼 html <el-upload :action="actionUrl" :auto-upload="false" :multiple="true" :file-list=" ...
  • 1.安裝jquery npm install jquery --save-dev 2.打開配置文件webpack.base.conf.js 加入'jquery': path.resolve(__dirname, '../node_modules/jquery/src/jquery') //引入jqu ...
  • 今天刷到一道面試題,["1", "2", "3"].map(parseInt)返回的結果是什麼呢?可能大家第一個想到的是 [1,2,3],但是,我可以明確的告訴你,這是結果錯的!真正的答案是 [1,NaN,NaN] 由於map()接收的回調函數可以有3個參數:callback(currentValu ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...