最近在看《大型網站系統與java中間件事件》這本書,收穫頗多。java
分佈式事務但願在多機環境下能夠像單機系統那樣作到強一致,這須要付出比較大的代價。而在有些場景下,接受狀態並不用時刻保持一致,只要最終一直就行。sql
CAP(Consistency Availability Partition-Tolerance)數據庫
Consistency: 即全部的節點在同一時間讀到一樣的數據,這就是數據上的一致性。網絡
Availability: 保證不管時成功仍是失敗,每一個請求都可以收到一個反饋。這裏的重點是系統必定要有響應。nosql
Partition-Tolerance:即使系統中有部分問題或者有消息的丟失,但系統仍可以繼續運行。這被稱爲分區容忍性。分佈式
可是,在分佈式系統中並不能同時知足上面三項。網站
1 選擇CA,放棄分區容忍性,增強一致性和可用性。這其實就是傳統的單機數據庫的選擇。設計
2 選擇AP,放棄一致性,追求分區容忍性及可用性。這是不少分佈式系統在設計時的選擇,例如不少nosql系統就是如此。中間件
3 選擇CP,放棄可用性,追求一致性和分區容忍性。這種選擇下的可用性會比較低,網絡的問題會直接讓整個系統不可用。事件
從上面的分析能夠看出,在分佈式系統中,咱們通常仍是選擇增強可用性和分區容忍性而犧牲一致性,而是首先知足A和P,而後看如何解決C的問題。
BASE(Basically Available Soft state Eventually consistent)
Basically Available: 基本可用,容許分區失敗。
Soft state: 軟狀態,接受一段時間的狀態不一樣步。
Eventually consistent: 最終一致,保證最終數據的狀態時一致的。
當咱們在分佈式系統中選擇了CAP中的A和P後,對於C,咱們採用的方式策略就是保證最終一致,也就是不保證數據變化後全部節點馬上一致,可是保證它們最終是一致的。在大型網站中,爲了更好地保持擴展性和可用性,通常都不會選擇強一致性,而是採用最終一致的策略來實現。