分布式系統(tǒng)題目答案(2)
6、分布式事務(wù)的解決方案
分布式事務(wù)是指一個事務(wù)包含多個操作,這些操作分布在不同的服務(wù)器上,要么都成功,要么都失敗。
分布式事務(wù)問題的主要來源
1、存儲,分庫分表跨庫增刪改時,保證數(shù)據(jù)的一致性
2、服務(wù)拆分,一個操作依賴多個服務(wù),一個服務(wù)失敗就影響了整體的操作分布式事務(wù)解決方案
2PC 兩階段提交,兩個階段:準(zhǔn)備與提交;兩個角色:事務(wù)管理者與資源管理者。容易產(chǎn)生同步阻塞、單點故障、數(shù)據(jù)不一致等問題,并不能完全保證事務(wù)的一致性。
3PC 三階段提交,三階段:預(yù)備、準(zhǔn)備、提交。與二階段提交相比,加入了超時機(jī)制解決同步阻塞的問題;加入預(yù)備階段提早發(fā)現(xiàn)問題。三階段提交也存在極小概率的數(shù)據(jù)不一致問題。
TCC 模式,分為三個操作:Try、Confirm、Cancel。TCC 是分為兩個階段提交。第一階段主業(yè)務(wù)服務(wù)調(diào)用全部的從業(yè)務(wù)服務(wù)的 Try 操作,并且事務(wù)管理器記錄操作日志;第二階段,當(dāng)全部從業(yè)務(wù)服務(wù)都成功時,直接執(zhí)行 Confirm 操作,否則會執(zhí)行 Cancel 逆操作進(jìn)行回滾。
Saga 模式,拆分分布式事務(wù)為多個本地事務(wù),然后由 Saga 引擎負(fù)責(zé)協(xié)調(diào)。比 TCC 少了一個 Try 操作,Saga 會直接提交到數(shù)據(jù)庫,出現(xiàn)失敗時進(jìn)行補償。極端情況下的補償動作可能比較麻煩;但對于簡單的業(yè)務(wù)邏輯侵入性更低,減少了通信次數(shù),更輕量。
補償模式,通過補償?shù)姆绞阶寯?shù)據(jù)最終一致。方式有:操作冪等 + 重試機(jī)制 + 人工介入機(jī)制;定時校對;網(wǎng)絡(luò)抖動和服務(wù)不可用導(dǎo)致的情況,可使用下次更新前,檢查和修復(fù)上一次數(shù)據(jù)的更新。
可靠事件模式,通過引入可靠的消息隊列,保證當(dāng)前的可靠事件投遞并且消息隊列確保事件傳遞至少一次,這個事件能夠被訂閱者消費即可。未操作或未消費消息的持久化、消息的冪等性、消息的重發(fā)、消息的 ACK 都是要注意的問題。
不要求最終一致性的柔性事務(wù),會盡最大努力通知。
7、解決分布式事務(wù)的開源組件
阿里開源組件 Seata,分為全局事務(wù)和分支事務(wù),分支事務(wù)滿足 ACID 特性,全局事務(wù)基于二階段提交對分支事務(wù)進(jìn)行協(xié)調(diào);同時也滿足上述的幾種模式。
http://seata.io/zh-cn/docs/overview/what-is-seata.html
tcc-transaction 框架是 TCC 模式的一種實現(xiàn),tcc-transaction 的使用
https://github.com/changmingxie/tcc-transaction
華為 ServiceComb 框架的 Saga 模塊:
https://github.com/apache/servicecomb-pack/blob/master/README_ZH.md
8、三階段提交比二階段提交的改進(jìn)
兩階段提交:
提交請求(Commit-request)階段,協(xié)調(diào)者將通知事務(wù)參與者執(zhí)行事務(wù)但不提交,參與者反饋是否可以正常提交。
提交(Commit)階段,協(xié)調(diào)者將基于第一個階段的反饋結(jié)果進(jìn)行決策,提交或回滾這個事務(wù);只有當(dāng)所有的參與者同意提交,協(xié)調(diào)者才會通知各個參與者提交事務(wù),否則協(xié)調(diào)者將通知各個參與者回滾事務(wù)
兩階段提交存在的問題:
資源被同步阻塞
協(xié)調(diào)者可能出現(xiàn)單點故障
Commit 階段發(fā)出 commit 通知,但網(wǎng)絡(luò)抖動可能導(dǎo)致出現(xiàn)數(shù)據(jù)不一致
三階段提交:
CanCommit 階段,協(xié)調(diào)者詢問參與者是否可以正常提交,此階段不執(zhí)行僅評估與反饋,反饋 no 或超時直接終止。
PreCommit 階段,所有參與者反饋可提交,進(jìn)行事務(wù)的預(yù)提交;否則反饋 no 或超時,中斷事務(wù)。
DoCommit 階段,事務(wù)提交;協(xié)調(diào)者沒接收到或接收超時中斷事務(wù);參與者接受協(xié)調(diào)者提交請求超時自動提交
三階段提交進(jìn)行了改進(jìn):
協(xié)調(diào)者與參與者都引入了超時機(jī)制,解決同步阻塞問題
添加預(yù)提交階段,鎖定資源前進(jìn)行了預(yù)判,提早發(fā)現(xiàn)問題
三階段提交依然存在數(shù)據(jù)不一致的問題,如網(wǎng)絡(luò)問題 DoCommit 階段接收者接收超時自動提交,其余節(jié)點回滾,此時就會產(chǎn)生數(shù)據(jù)不一致。
