在個人博客中,介紹過不少關於分佈式和事務的文章,在閱讀本文以前,但願讀者能夠對這些基礎知識有所瞭解,這裏簡單把以前的文章列舉下,已經按照順序排好,可按順序閱讀:html
初識分佈式系統數據庫
這裏簡單總結下之前幾篇文章,算是本文的背景知識。在分佈式系統中,存在CAP理論,便可用性、數據一致性和分區容錯性沒法同時知足。因此,一個基於CAP的最終一致性理論BASE理論是目前解決分佈式問題比較靠譜的。spa
在分佈式系統中,是沒法使用本地事務保證數據的一致性的。一種標準的分佈式事務就是全局事務(DTP模型)。他是基於2PC來控制的。可是因爲2PC自身就存在同步阻塞的問題,這也就致使全局事務效率很低。因此,這種全局事務並不適合解決大型網站的分佈式事務問題。
在業內,主要用來解決分佈式事務的方案是使用柔性事務。所謂柔性事務,相比較與數據庫事務中的ACID這種剛性事務來講,柔性事務保證的事「基本可用,最終一致。」這其實就是基於BASE理論,保證數據的最終一致性。
雖然柔性事務並不像剛性事務那樣徹底遵循ACID,可是,也是部分遵循ACID的,簡單看一下關於ACID四個屬性,柔性事務的支撐程度:
原子性:嚴格遵循
一致性:事務完成後的一致性嚴格遵循;事務中的一致性可適當放寬
隔離性:並行事務間不可影響;事務中間結果可見性容許安全放寬
持久性:嚴格遵循
前面介紹過了柔性事務的定義,目前,在業內,關於柔性事務,最主要的有如下三種類型:異步確保型、補償型、最大努力通知型。
這三種類型的柔性事務基本都有對應的實現,不一樣的場景須要使用不一樣的柔性事務類型。而這幾種柔性事務類型,其實仍是依賴一些基礎模式的,或者叫作基礎接口,基礎功能。
好比,要想使用可靠消息最終一致來實現異步確保型柔性事務,就依賴接冪等操做和可查詢操做。關於具體實現,咱們在後面的文章中介紹,本文簡單介紹下這些實現柔性事務依賴的基礎模式。
注意,下面要介紹的柔性事務的模式,並非柔性事務的方案。這些是作柔性事務的基礎。也就是說,若是你想作柔性事務,你的接口和功能要知足下面的幾個要求。不必定要都知足,由於不一樣的方案的要求不同。可是都不知足的話,是不可能作柔性事務的。
可查詢操做,幾乎是全部的分佈式解決方案都須要的。
舉一個常見的分佈式場景的例子,如訂單處理這一功能:
/** 支付訂單處理 **/
public void completeOrder() {
orderDao.update(); // 訂單服務本地更新訂單狀態
accountService.update(); // 調用資金帳戶服務給資金賬戶加款
pointService.update(); // 調用積分服務給積分賬戶增長積分
accountingService.insert(); // 調用會計服務向會計系統寫入會計原始憑證
merchantNotifyService.notify(); // 調用商戶通知服務向商戶發送支付結果通知
}
複製代碼
以上這個支付訂單處理的例子中,除了訂單服務本地更新訂單狀態
之外的全部操做,都須要調用RPC接口來執行,這種狀況單純的本地事務就沒法保證數據的一致性了。就須要引入分佈式事務。在分佈式事務執行過程當中,若是某一個步驟執行出錯,就須要明確的知道其餘幾個操做的處理狀況,這就須要其餘的服務都可以提供查詢接口,保證能夠經過查詢來判斷操做的處理狀況。
爲了保證操做的可查詢,須要對於每個服務的每一次調用都有一個全局惟一的標識,能夠是業務單據號(如訂單號)、也能夠是系統分配的操做流水號(如支付記錄流水號)。除此以外,操做的時間信息也要有完整的記錄。
冪等性,實際上是一個數學概念。冪等函數,或冪等方法,是指可使用相同參數重複執行,並能得到相同結果的函數,如:
f(f(x)) = f(x)
複製代碼
在編程中一個冪等操做的特色是其任意屢次執行所產生的影響均與一次執行的影響相同。也就是說,同一個方法,使用一樣的參數,調用屢次產生的業務結果與調用一次產生的業務結果相同。
這一個要求其實也比較好理解,由於要保證數據的最終一致性,不少解決防範都會有不少重試的操做,若是一個方法不保證冪等,那麼將沒法被重試。
冪等操做的實現方式有多種,如在系統中緩存全部的請求與處理結果、檢測到重複操做後,直接返回上一次的處理結果等。
提到事務,爲了保證原子性,就可能發生commit和rollback,那麼在分佈式事務中,要想進行rollback,就須要提供可補償操做。
好比上面的訂單處理的例子中,在調用積分服務給積分賬戶增長積分
操做執行以後,通過分佈式事務協調,最終決定回滾整個事務,那麼就須要提供一個調用積分服務給積分賬戶扣減積分
的操做。
而且,補償操做同時也須要知足冪等性。
TCC 即 Try-Confirm-Cancel。
Try: 嘗試執行業務
完成全部業務檢查(一致性) 預留必須業務資源(準隔離性)
Confirm:確認執行業務
真正執行業務 不做任何業務檢查 只使用Try階段預留的業務資源 Confirm操做要知足冪等性
Cancel: 取消執行業務
釋放Try階段預留的業務資源
Cancel操做要知足冪等性
這種類型和可補償操做相似,就是提供一種提交和回滾的機制。是一種典型的兩階段類型的操做。這裏說的兩階段類型操做並非指2PC,他和2PC仍是有區別的。
TCC與2PC協議比較 TCC位於業務服務層而非資源層 TCC沒有單獨的準備(Prepare)階段,Try操做兼備資源操做與準備能力 • Try操做能夠靈活選擇業務資源的鎖定粒度(以業務定粒度) TCC有較高開發成本
本文主要是簡單介紹了一下柔性事務和柔性事務實現的基礎。柔性事務是目前主流的分佈式事務解決方案,其基礎模式包含四個:冪等操做、可補償操做、可查詢操做和TCC操做。後續文章會分別介紹關於分佈式事務的解決方案,敬請期待。