在一個分佈式系統(指系統中的節點互相鏈接並共享數據)中,當涉及讀寫操做時,只能保證一致性 (Consistency)、可用性 (Availability)、分區容錯性 (Partition Tolerance)三者中的兩個,另一個必須被犧牲。數據庫
那麼什麼樣的分佈式系統是節點之間互聯並共享數據呢?網絡
典型的場景就是數據庫的主從集羣,一個數據庫集羣有一個主,多個從,主從之間會進行數據複製。因此適用於CAP原理。架構
那麼若是我如今是一個Redis的集羣,集羣中每臺機器存儲不一樣的數據,集羣中每臺機器不須要複製和傳遞數據,那麼就不屬於CAP原理的討論範圍。同理,若是是A,B兩個不一樣的業務系統,好比招行帳號A給工行帳號B轉帳100元,因爲招行和工行是兩個不一樣的業務系統,業務上隔離,且他們之間也沒有共享的數據,從而也不屬於CAP原理的討論範圍。分佈式
經過上面的分析,咱們知道CAP中的數據一致性,本質上是爲了維護同一個數據的不一樣副本之間的一致性。而更多的時候,咱們要解決的是不一樣業務系統之間的數據一致性,即數據之間老是應該知足規定的業務規則。典型的場景好比有跨行轉帳、訂單和減庫存。這種場景,因爲沒有數據共享的特徵,因此不適用於CAP。好比A銀行的帳戶給B銀行的帳戶轉帳100元,那麼轉帳先後,兩個帳戶的錢加起來應該不變。也就是A扣款了,B就必須加款。那麼這種場景如何解決呢?通常的作法是採用分佈式事務,常見的分佈式事務的解決方案有:2PC\3PC、TCC、基於分佈式MQ+本地消息、分佈式MQ事務消息、Sagas。架構設計