背景
最近一直在思考,工作這么多年下遇到的分布式系統的一下問題,以及針對這些問題提供的解決方案。
借這個機會,順便梳理清楚這塊知識,希望同大家一起探討下
常見一致性問題
下訂單減庫存
在我們做的電商系統中,會有這樣的一個場景:用戶下單購買某個商品,然后進行扣減商品庫存的場景。
- 如果先下訂單,然后扣減庫存,會導致超賣
- 如果下訂單失敗,扣減庫存成功,那么會導致少賣
這兩種情況的發生都會導致我們系統出現一致性的問題,嚴重的話,需要對用戶做出一定的經濟補償。
調用超時
業務開發的過程中,肯定會有我們維護的服務調用其他團隊的服務,即使在機房內部進行網絡調用,也或多或少的存在系統調用超時的現象,如果出現這樣的現象,我們該怎么解決呢?
解決一致性問題的思路
酸鹼中和
ACID : 酸, BASE:鹼,其實就是酸鹼中和的原理
1. ACID
ACID,是指數據庫管理系統在寫入數據過程中,為保證事務是正確可靠性。
所必須具備的四個特性:
- A: Atomicity 原子性 一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節
- C: Consistency 一致性 事務開始之前和事務結束以后,數據庫的完整性沒有被破壞
- I: Isolation 隔離性 數據庫允許多個並發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)
- D: Durability 持久性 事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失
像 MySQL、Oracle 這樣關系型數據庫是支持 ACID 特性的強一致性要求的。本身強一致性就不允許出現不一致性的問題,底層都是通過 MVCC 來控制實現的
剛剛上面提到的下訂單減庫存就可以關系型數據庫的強一致性來解決。將訂單表與庫存表放在一個數據庫 Instance 中,通過數據庫 ACID 的特性來解決少賣或者超賣的問題。
但是如果遇到數據量比較大的情況怎么辦?訂單表有多張,我們該怎么解決呢?
其實,即使遇到訂單表進行拆分,我們可以仍然采用數據庫 ACID 的特性來解決。怎么弄?我們可以將訂單表的拆表維度與庫存表的拆分維度控制在一個數據分片中,但是具體怎么拆分呢?需要各位根據自己的業務規則來划分開來
2. BASE
BASE 思想解決了 CAP 提出的分布式一致性與可用性不能同時兼顧的問題。BASE 思想與 ACID 思想截然不同,它其實是滿足 CAP 理論,通過犧牲強一致性來換取可用性。
BASE 理論:
- BA:Basically Available,基本可用性
- S: Soft State 軟狀態 接受狀態在一段時間內部同步
- E:Eventually Consistent 最終一致性 在一定的時間窗口中,最終數據達成一致即可
軟狀態是實現 BASE 的方法,基本可用域最終一致性是必須到達的目標。以 BASE 的思想由於不保證強一致性,所有接受系統在一定時間內數據存在不一致,不過在處理請求的過程中,需要記錄知道每次請求的狀態,以后出現問題的時候,回滾到中間任何臨時狀態,達到最終一致性
3. CAP
當我們服務發展越來越多,是不可避免就會需要將服務進行拆分。一旦服務進行拆分后,它就不在是一個單機的系統,而是通俗意義上的分布式系統。說到分布式系統,我們一定要說下最為經典的帽子理論。如果我都沒有聽說過帽子理論,我出門都不好意思打招呼。
分布式系統 CAP 理論:
- C: Consistence 一致性 所有節點訪問同一份最新的數據副本
- A: Availability 可用性 每次請求都能在有限的時間內獲取到響應——但是不保證獲取的數據為最新數據
- P: Network partitioning 分區容錯性 盡管網絡上有部分消息丟失,但仍然可以繼續工作
CAP 原理證明:分布式系統只能滿足三項中的兩項而不可能滿足全部三項。理解 CAP 理論的最簡單方式就是想象兩個節點處在 2 個機房中。允許至少一個節點更新狀態會導致數據不一致,即喪失了 C 性質。如果為了保證數據一致性,將分區一側的節點設置為不可用,那么又喪失了 A 性質。除非兩個節點可以互相通信,才能既保證C 又保證 A,這又會導致喪失P性質。
總結
本次文章介紹 ACID、CAP 和 BASE 思想。在傳統數據庫領域中采用 ACID 理論,追求強一致性。但是在大型分布式系統中,采用 BASE 的設計思想,通過犧牲強一致性來獲取高可用性及最終的一致性。兩種設計理念截然不同,大家需要根據自己的業務場景,來決定到底哪用方式。
參考
- 分布式服務架構原理、設計與實戰