分佈式事務就是保證各個微服務之間數據一致,本質上就是保證不一樣數據庫的數據一致性。一致性狀態包含算法
所以,存在以下幾種方案:數據庫
2PC ,二階段提交是一種儘可能強一致性設計,引入一個事務協調者來協調和管理各參與者的提交和回滾,包含準備和提交兩個階段,階段之間同步阻塞,準備階段協調者有超時機制。編程
大體流程:服務器
存在問題:負載均衡
場景:目前支付寶使用2PC兩階段提交思想實現了分佈式事務服務,它是一個分佈式事務框架,用來保障在大規模分佈式環境下事務的最終一致性。框架
3PC,爲了解決2PC的不肯定性,包含準備,預提交,提交三個階段。準備階段只是詢問參與者的狀態,其餘階段分別對應2PC。相比2PC,參與者也有超時機制(防止在2PC協調者提交階段準備發送命令的時候掛了,參與者一直阻塞等待的狀況),而且新增了一個階段使得故障恢復以後協調者的決策複雜度下降(解決2PC的不肯定性,在將要發生不肯定性時,新協調者發現有一個參與者處於預提交或者提交階段,那麼代表已經通過了全部參與者的確認了,因此此時執行的就是提交命令)異步
場景:沒有找到具體實現,偏理論。分佈式
2PC 和 3PC 都不能保證數據100%一致,所以通常都須要有定時掃描補償機制。函數
TCC,2PC 和 3PC 都是數據庫層面的,而 TCC 是業務層面的分佈式事務。TCC指的是Try - Confirm - Cancel
微服務
其也存在一個事務管理者,用來記錄TCC全局事務狀態提交或者回滾。其流程和2PC差很少。但業務的侵入較大、業務耦合度高,須要將原來一個接口能夠實現的邏輯拆分爲三個接口。
場景:TCC 須要提供三個接口,提升了編程的複雜性,而且依賴於業務方來配合提供這樣的接口,推行難度大,因此通常不推薦使用這種方式。
本地消息表,利用各個系統本地事務來實現分佈式事務。系統中會定義一個存放本地消息的表,通常都是放在數據庫中。
大體流程:
場景:跨行轉帳可經過該方案實現。在銀行一的用戶A向銀行二的用戶B轉帳
消息事務,只有阿里的RocketMQ支持,實現了最終一致性。
大體流程:
場景:用戶註冊成功後發送郵件、電商系統給用戶發送優惠券等須要保證最終一致性的場景。
最大努力通知,是最簡單的一種柔性事務,適用於一些對最終一致性不敏感的業務,且被動方的處理結果,並不會影響主動方的處理結果。
大體流程:
場景:最多見的場景就是支付回調,支付服務收到第三方服務支付成功通知後,先更新本身庫中訂單支付狀態,而後同步通知訂單服務支付成功。若是這次同步通知失敗,會經過異步腳步不斷重試地調用訂單服務的接口。
咱們從分佈式系統中負載均衡的問題來描述分佈式hash。
常見的負載均衡算法以下:
隨機訪問策略。隨機訪問,可能形成服務器負載壓力不均衡。
輪詢策略。請求均勻分配,可是浪費了性能高的服務器的資源。
權重輪詢策略。根據權重輪詢,權重須要靜態配置,沒法自動調節。
Hash取模策略。經過hash取模,伸縮性差,當新增或者下線服務器機器時候,用戶與服務器的映射關係會大量失效。
一致性哈希策略。簡單來講就是將整個哈希值(int範圍)空間組織成一個虛擬的hash圓環,將每一個服務器標識符跟int最大hash取模,獲得一些對應在hash環上的點。用戶在訪問的時候,根據用戶的標識符使用一樣的hash函數取模,獲得hash環上的一點,但這一點極可能沒有服務器映射在上面,因此會順時針行走,遇到的第一臺服務器就是應該處理該用戶請求的服務器。
優勢:
缺點: