




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
微服務(wù)架構(gòu)下的數(shù)據(jù)一致性方案隨著微服務(wù)架構(gòu)的推廣,越來越多的公司采用微服務(wù)架構(gòu)來構(gòu)建自己的業(yè)務(wù)平臺。就像前邊的文章說的,微服務(wù)架構(gòu)為業(yè)務(wù)開發(fā)帶來了諸多好處的同時,例如單一職責(zé)、獨立開發(fā)部署、功能復(fù)用和系統(tǒng)容錯等等,也帶來一些問題。例如上手難度變大,運維變得更復(fù)雜,模塊之間的依賴關(guān)系更復(fù)雜,數(shù)據(jù)一致性難以保證,等等。但是辦法總是比問題多,本篇文章就來介紹一下我們是如何保障微服務(wù)架構(gòu)的數(shù)據(jù)一致性的。
微服務(wù)架構(gòu)的數(shù)據(jù)一致性問題以電商平臺為例,當(dāng)用戶下單并支付后,系統(tǒng)需要修改訂單的狀態(tài)并且增加用戶積分。由于系統(tǒng)采用的是微服務(wù)架構(gòu),分離出了支付服務(wù)、訂單服務(wù)和積分服務(wù),每個服務(wù)都有獨立數(shù)據(jù)庫做數(shù)據(jù)存儲。當(dāng)用戶支付成功后,無論是修改訂單狀態(tài)失敗還是增加積分失敗,都會造成數(shù)據(jù)的不一致。為了解決例子中的數(shù)據(jù)一致性問題,一個最直接的辦法就是考慮數(shù)據(jù)的強一致性。那么如何保證數(shù)據(jù)的強一致性呢?我們從關(guān)系型數(shù)據(jù)庫的ACID理論說起。ACID關(guān)系型數(shù)據(jù)庫具有解決復(fù)雜事務(wù)場景的能力,關(guān)系型數(shù)據(jù)庫的事務(wù)滿足ACID的特性。Atomicity:原子性(要么都做,要么都不做)Consistency:一致性(數(shù)據(jù)庫只有一個狀態(tài),不存在未確定狀態(tài))Isolation:隔離性(事務(wù)之間互不干擾)Durability:永久性(事務(wù)一旦提交,數(shù)據(jù)庫記錄永久不變)具有ACID特性的數(shù)據(jù)庫支持?jǐn)?shù)據(jù)的強一致性,保證了數(shù)據(jù)本身不會出現(xiàn)不一致。然而微服務(wù)架構(gòu)下,每個微服務(wù)都有自己的數(shù)據(jù)庫,導(dǎo)致微服務(wù)架構(gòu)的系統(tǒng)不能簡單地滿足ACID,我們就需要尋找微服務(wù)架構(gòu)下的數(shù)據(jù)一致性解決方案。微服務(wù)架構(gòu)的系統(tǒng)本身是一種分布式系統(tǒng),而本文討論的問題其實也就是分布式事務(wù)之?dāng)?shù)據(jù)一致性的問題,我們來聊聊分布式系統(tǒng)的CAP理論和BASE理論。CAPCAP是指在一個分布式系統(tǒng)下,包含三個要素:Consistency(一致性)、Availability(可用性)、Partitiontolerance(分區(qū)容錯性),并且三者不可得兼。C:Consistency,一致性,所有數(shù)據(jù)變動都是同步的。A:Availability,可用性,即在可以接受的時間范圍內(nèi)正確地響應(yīng)用戶請求。P:Partitiontolerance,分區(qū)容錯性,即某節(jié)點或網(wǎng)絡(luò)分區(qū)故障時,系統(tǒng)仍能夠提供滿足一致性和可用性的服務(wù)。關(guān)系型數(shù)據(jù)庫單節(jié)點保證了數(shù)據(jù)強一致性(C)和可用性(A),但是卻無法保證分區(qū)容錯性(P)。然而在分布式系統(tǒng)下,為了保證模塊的分區(qū)容錯性(P),只能在數(shù)據(jù)強一致性(C)和可用性(A)之間做平衡。具體表現(xiàn)為在一定時間內(nèi),可能模塊之間數(shù)據(jù)是不一致的,但是通過自動或手動補償后能夠達(dá)到最終的一致。BASEBASE理論主要是解決CAP理論中分布式系統(tǒng)的可用性和一致性不可兼得的問題。BASE理論包含以下三個要素:BA:BasicallyAvailable,基本可用。S:SoftState,軟狀態(tài),狀態(tài)可以有一段時間不同步。E:EventuallyConsistent,最終一致,最終數(shù)據(jù)是一致的就可以了,而不是時時保持強一致。BASE模型與ACID不同,滿足CAP理論,通過犧牲強一致性來保證系統(tǒng)可用性。由于犧牲了強一致性,系統(tǒng)在處理請求的過程中,數(shù)據(jù)可以存在短時的不一致。系統(tǒng)在處理業(yè)務(wù)時,記錄每一步的臨時狀態(tài)。當(dāng)出現(xiàn)異常時,根據(jù)狀態(tài)判斷是否繼續(xù)處理請求或者退回原始狀態(tài),從而達(dá)到數(shù)據(jù)的最終一致。例如,在上面的案例中,支付成功,訂單也成功,但增加積分失敗,此時,不應(yīng)回滾支付和訂單,而應(yīng)通過一些補償方法來讓積分得以正確地增加。后面會講到具體的實現(xiàn)方法。在分享我們的分布式事務(wù)實踐方案之前,先看看早期解決分布式事務(wù)問題的二階段提交協(xié)議。二階段提交協(xié)議X/OpenDTP(DistributedTransactionProcess)是一個分布式事務(wù)模型,此模型主要使用二階段提交(2PC,Two-Phase-Commit)來保證分布式事務(wù)的完整性。在這個模型里面,有三個角色:AP:Application,應(yīng)用程序,業(yè)務(wù)層。RM:ResourceManager,資源管理器,關(guān)系型數(shù)據(jù)庫或支持XA接口(XA規(guī)范是X/Open組織定義的分布式事務(wù)規(guī)范)的組件。TM:TransactionManager,事務(wù)管理器,負(fù)責(zé)各個RM的提交和回滾。當(dāng)應(yīng)用程序(AP)調(diào)用了事務(wù)管理器(TM)的提交方法時,事務(wù)的提交分為兩個階段實行。第一階段(準(zhǔn)備階段)TM通知所有參與事務(wù)的各個RM,給每個RM發(fā)送prepare消息。RM接收到消息后進(jìn)入準(zhǔn)備階段后,要么直接返回失敗,要么創(chuàng)建并執(zhí)行本地事務(wù),寫本地事務(wù)日志(redo和undo日志),但是不提交(此處只保留最后一步耗時最少的提交操作給第二階段執(zhí)行)。第二階段(提交/回滾階段)TM收到RM準(zhǔn)備階段的失敗消息或者獲取RM返回消息超時,則直接給RM發(fā)送回滾(rollback)消息,否則發(fā)送提交(commit)消息。RM根據(jù)TM的指令執(zhí)行提交或者回滾,執(zhí)行完成后釋放所有事務(wù)處理過程中使用的鎖(最后階段釋放鎖)。二階段提交的利弊優(yōu)點2PC提供了一套完整的分布式事務(wù)的解決方案,遵循事務(wù)嚴(yán)格的ACID特性。缺點TM通過XA接口與各個RM之間進(jìn)行數(shù)據(jù)交互,從第一階段的準(zhǔn)備階段,業(yè)務(wù)所涉及的數(shù)據(jù)就被鎖定,并且鎖定跨越整個提交流程。在高并發(fā)和涉及業(yè)務(wù)模塊較多的情況下對數(shù)據(jù)庫的性能影響較大。二階段是反可伸縮模式的,業(yè)務(wù)規(guī)模越大,涉及模塊越多,局限性越大,系統(tǒng)可伸縮性越差。在技術(shù)棧比較雜的分布式應(yīng)用中,存儲組件有很多不支持XA協(xié)議。二階段的諸多弊端,導(dǎo)致分布式系統(tǒng)下無法直接使用此方案來解決數(shù)據(jù)一致性問題,但它提供了解決分布式系統(tǒng)下數(shù)據(jù)一致性問題的思路。下面就通過案例來分享我們是如何保證微服務(wù)架構(gòu)的數(shù)據(jù)一致性的。可靠消息最終一致性可靠消息最終一致性方案本質(zhì)上是利用MQ組件實現(xiàn)的二階段提交。此方案涉及3個模塊:上游應(yīng)用,執(zhí)行業(yè)務(wù)并發(fā)送MQ消息。可靠消息服務(wù)和MQ消息組件,協(xié)調(diào)上下游消息的傳遞,并確保上下游數(shù)據(jù)的一致性。下游應(yīng)用,監(jiān)聽MQ的消息并執(zhí)行自身業(yè)務(wù)。上游應(yīng)用執(zhí)行業(yè)務(wù)并發(fā)送MQ消息(第一階段)上游應(yīng)用將本地業(yè)務(wù)執(zhí)行和消息發(fā)送綁定在同一個本地事務(wù)中,保證要么本地操作成功并發(fā)送MQ消息,要么兩步操作都失敗并回滾。上游應(yīng)用和可靠消息之間的業(yè)務(wù)交互圖如下:上游應(yīng)用發(fā)送待確認(rèn)消息到可靠消息系統(tǒng)可靠消息系統(tǒng)保存待確認(rèn)消息并返回上游應(yīng)用執(zhí)行本地業(yè)務(wù)上游應(yīng)用通知可靠消息系統(tǒng)確認(rèn)業(yè)務(wù)已執(zhí)行并發(fā)送消息??煽肯⑾到y(tǒng)修改消息狀態(tài)為發(fā)送狀態(tài)并將消息投遞到MQ中間件。以上每一步都可能出現(xiàn)失敗情況,分析一下這5步出現(xiàn)異常后上游業(yè)務(wù)和消息發(fā)送是否一致:上游應(yīng)用執(zhí)行完成,下游應(yīng)用尚未執(zhí)行或執(zhí)行失敗時,此事務(wù)即處于BASE理論的SoftState狀態(tài)。下游應(yīng)用監(jiān)聽MQ消息并執(zhí)行業(yè)務(wù)(第二階段)下游應(yīng)用監(jiān)聽MQ消息并執(zhí)行業(yè)務(wù),并且將消息的消費結(jié)果通知可靠消息服務(wù)??煽肯⒌臓顟B(tài)需要和下游應(yīng)用的業(yè)務(wù)執(zhí)行保持一致,可靠消息狀態(tài)不是已完成時,確保下游應(yīng)用未執(zhí)行,可靠消息狀態(tài)是已完成時,確保下游應(yīng)用已執(zhí)行。下游應(yīng)用和可靠消息服務(wù)之間的交互圖如下:下游應(yīng)用監(jiān)聽MQ消息組件并獲取消息下游應(yīng)用根據(jù)MQ消息體信息處理本地業(yè)務(wù)下游應(yīng)用向MQ組件自動發(fā)送ACK確認(rèn)消息被消費下游應(yīng)用通知可靠消息系統(tǒng)消息被成功消費,可靠消息將該消息狀態(tài)更改為已完成。以上每一步都可能出現(xiàn)失敗情況,分析一下這4步出現(xiàn)異常后下游業(yè)務(wù)和消息狀態(tài)是否一致:通過分析以上兩個階段可能失敗的情況,為了確保上下游數(shù)據(jù)的最終一致性,在可靠消息系統(tǒng)中,需要開發(fā)消息狀態(tài)確認(rèn)和消息重發(fā)兩個功能以實現(xiàn)BASE理論的EventuallyConsistent特性。消息狀態(tài)確認(rèn)可靠消息服務(wù)定時監(jiān)聽消息的狀態(tài),如果存在狀態(tài)為待確認(rèn)并且超時的消息,則表示上游應(yīng)用和可靠消息交互中的步驟4或者5出現(xiàn)異常??煽肯t攜帶消息體內(nèi)的信息向上游應(yīng)用發(fā)起請求查詢該業(yè)務(wù)是否已執(zhí)行。上游應(yīng)用提供一個可查詢接口供可靠消息追溯業(yè)務(wù)執(zhí)行狀態(tài),如果業(yè)務(wù)執(zhí)行成功則更改消息狀態(tài)為已發(fā)送,否則刪除此消息確保數(shù)據(jù)一致。具體流程如下:可靠消息查詢超時的待確認(rèn)狀態(tài)的消息向上游應(yīng)用查詢業(yè)務(wù)執(zhí)行的情況業(yè)務(wù)未執(zhí)行,則刪除該消息,保證業(yè)務(wù)和可靠消息服務(wù)的一致性。業(yè)務(wù)已執(zhí)行,則修改消息狀態(tài)為已發(fā)送,并發(fā)送消息到MQ組件。消息重發(fā)消息已發(fā)送則表示上游應(yīng)用已經(jīng)執(zhí)行,接下來則確保下游應(yīng)用也能正常執(zhí)行。可靠消息服務(wù)發(fā)現(xiàn)可靠消息服務(wù)中存在消息狀態(tài)為已發(fā)送并且超時的消息,則表示可靠消息服務(wù)和下游應(yīng)用中存在異常的步驟,無論哪個步驟出現(xiàn)異常,可靠消息服務(wù)都將此消息重新投遞到MQ組件中供下游應(yīng)用監(jiān)聽。下游應(yīng)用監(jiān)聽到此消息后,在保證冪等性的情況下重新執(zhí)行業(yè)務(wù)并通知可靠消息服務(wù)此消息已經(jīng)成功消費,最終確保上游應(yīng)用、下游應(yīng)用的數(shù)據(jù)最終一致性。具體流程如下:可靠消息服務(wù)定時查詢狀態(tài)為已發(fā)送并超時的消息可靠消息將消息重新投遞到MQ組件中下游應(yīng)用監(jiān)聽消息,在滿足冪等性的條件下,重新執(zhí)行業(yè)務(wù)。下游應(yīng)用通知可靠消息服務(wù)該消息已經(jīng)成功消費。通過消息狀態(tài)確認(rèn)和消息重發(fā)兩個功能,可以確保上游應(yīng)用、可靠消息服務(wù)和下游應(yīng)用數(shù)據(jù)的最終一致性。當(dāng)然在實際接入過程中,需要引入人工干預(yù)功能。比如引入重發(fā)次數(shù)限制,超過重發(fā)次數(shù)限制的將消息修改為死亡消息,等待人工干預(yù)。代入開篇案例,通過可靠消息最終一致性方案,第一階段,訂單狀態(tài)更改之前,訂單服務(wù)向可靠消息服務(wù)請求保存待確認(rèn)消息??煽肯⒎?wù)保存消息并返回。訂單服務(wù)接收到返回信息后執(zhí)行本地業(yè)務(wù)并通知可靠消息服務(wù)業(yè)務(wù)已執(zhí)行。消息服務(wù)更改消息狀態(tài)并將消息投遞到MQ中間件。第二階段,積分系統(tǒng)監(jiān)聽到MQ消息,查看積分是否已增加,如果沒有增加則修改積分,然后請求可靠消息服務(wù)??煽肯⒎?wù)接收到積分系統(tǒng)的請求,將消息狀態(tài)更改為已完成。到這里,已經(jīng)介紹完如何通過可靠消息服務(wù)來保證數(shù)據(jù)的一致性。但由于引入了可靠消息服務(wù)和消息隊列,帶來了一定的復(fù)雜性,所以,它更適用于跨平臺技術(shù)棧不統(tǒng)一的場景。下面再來介紹在技術(shù)棧統(tǒng)一的情況下,如何通過TCC來解決數(shù)據(jù)一致的方法。TCC(Try-Confirm-Cancel)TCC方案是二階段提交的另一種實現(xiàn)方式,它涉及3個模塊,主業(yè)務(wù)、從業(yè)務(wù)和活動管理器(協(xié)作者)。下面這張圖是互聯(lián)網(wǎng)上關(guān)于TCC比較經(jīng)典的圖示:第一階段:主業(yè)務(wù)服務(wù)分別調(diào)用所有從業(yè)務(wù)服務(wù)的try操作,并在活動管理器中記錄所有從業(yè)務(wù)服務(wù)。當(dāng)所有從業(yè)務(wù)服務(wù)try成功或者某個從業(yè)務(wù)服務(wù)try失敗時,進(jìn)入第二階段。第二階段:活動管理器根據(jù)第一階段從業(yè)務(wù)服務(wù)的try結(jié)果來執(zhí)行confirm或cancel操作。如果第一階段所有從業(yè)務(wù)服務(wù)都try成功,則協(xié)作者調(diào)用所有從業(yè)務(wù)服務(wù)的confirm操作,否則,調(diào)用所有從業(yè)務(wù)服務(wù)的cancel操作。在第二階段中,confirm和cancel同樣存在失敗情況,所以需要對這兩種情況做異常處理以保證數(shù)據(jù)一致性。Confirm失?。簞t回滾所有confirm操作并執(zhí)行cancel操作。Cancel失?。簭臉I(yè)務(wù)服務(wù)需要提供自動cancel機制,以保證cancel成功。目前有很多基于RPC的TCC框架,但是不適用于微服務(wù)架構(gòu)下基于HTTP協(xié)議的交互模式。我們這次只討論基于HTTP協(xié)議的TCC實現(xiàn)。具體的實現(xiàn)流程如下:主業(yè)務(wù)服務(wù)調(diào)用從業(yè)務(wù)服務(wù)的try操作,并獲取confirm/cancel接口和超時時間。如果從業(yè)務(wù)都try成功,主業(yè)務(wù)服務(wù)執(zhí)行本地業(yè)務(wù),并將獲取的confirm/cancel接口發(fā)送給活動管理器,活動管理器會順序調(diào)用從業(yè)務(wù)1和從業(yè)務(wù)2的confirm接口并記錄請求狀態(tài),如果請求成功,則通知主業(yè)務(wù)服務(wù)提交本地事務(wù)。如果confirm部分失敗,則活動管理器會順序調(diào)用從業(yè)務(wù)1和從業(yè)務(wù)2的cancel接口來取消try的操作。如果從業(yè)務(wù)部分或全部try失敗,則主業(yè)務(wù)直接回滾并結(jié)束,而try成功的從業(yè)務(wù)服務(wù)則通過定時任務(wù)來處理處于try完成但超時的數(shù)據(jù),將這些數(shù)據(jù)做回滾處理保證主業(yè)務(wù)服務(wù)和從業(yè)務(wù)服務(wù)的數(shù)據(jù)一致。代入開篇提到的案例,通過TCC方案,訂單服務(wù)在訂單狀態(tài)修改之前執(zhí)行預(yù)增積分操作(try),并從積分服務(wù)獲取confirm/cancel預(yù)增積分的請求地址。如果預(yù)增積分(try)成功,則訂單服務(wù)更改訂單狀態(tài)并通知活動管理器,活動管理器請求積分模塊的confirm接口來增加積分。如果預(yù)增積分(try)失敗,則訂單服務(wù)業(yè)務(wù)回滾。積分服務(wù)通過定時任務(wù)刪除預(yù)增積分(try)超時的數(shù)據(jù)。另外如果活動管理器調(diào)用積分服務(wù)的confirm接口失敗,則活動管理器調(diào)用積分服務(wù)cancel接口來取消預(yù)增積分,從而,保證訂單和積分?jǐn)?shù)據(jù)的最終一致性。通過上面的對可靠消息服務(wù)和TCC方案的描述,我們解決了技術(shù)棧一致和不一致的兩種情況下的數(shù)據(jù)一致性問題。但是,通常在這些核心業(yè)務(wù)上有很多附加業(yè)務(wù),比如當(dāng)用戶支付完成后,需要通過短信通知用戶支付成功。這一類業(yè)務(wù)的成功或者失敗不會影響核心業(yè)務(wù),甚至很多大型互聯(lián)網(wǎng)平臺在并高并發(fā)的情況下會主動關(guān)閉這一類業(yè)務(wù)以保證核心業(yè)務(wù)的順利執(zhí)行。那么怎么處理這類情況呢,我們來看看最大努力通知方案。最大努力通知最大努力通知方案涉及三個模塊:上游應(yīng)用,發(fā)消息到MQ隊列。下游應(yīng)用(例如短信服務(wù)、郵件服務(wù)),接受請求,并返回通知結(jié)果。最大努力通知服務(wù),監(jiān)聽消息隊列,將消息存儲到數(shù)據(jù)庫中,并按照通知規(guī)則調(diào)用下游應(yīng)用的發(fā)送通知接口。具體流程如下:上游應(yīng)用發(fā)送MQ消息到MQ組件內(nèi),消息內(nèi)包含通知規(guī)則和通知地址最大努力通知服務(wù)監(jiān)聽到MQ內(nèi)的消息,解析通知規(guī)則并放入延時隊列等待觸發(fā)通知最大努力通知服務(wù)調(diào)用下游的通知地址,如果調(diào)用成功,則該消息標(biāo)記為通知成功,如果失敗則在滿足通知規(guī)則(例如5分鐘發(fā)一次,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 25年公司廠級員工安全培訓(xùn)考試試題完美版
- 2025年新員工入職安全培訓(xùn)考試試題能力提升
- 2025年新員工入職安全培訓(xùn)考試試題加答案可下載
- 定制家具改造合同
- 汽車輪轂維修與保養(yǎng)協(xié)議
- 拍賣結(jié)果通知合同
- 短租合同的延續(xù)條款
- 2025至2030年三烯丙基異氰脲酸脂項目投資價值分析報告
- 2025至2030年P(guān)E藍(lán)桶料項目投資價值分析報告
- 2025至2030年GPS衛(wèi)星模擬器項目投資價值分析報告
- 應(yīng)用文考情分析與寫作方法指導(dǎo)(七種常見應(yīng)用文體)-【中職專用】備戰(zhàn)2025年四川單招(中職類)語文備考專項復(fù)習(xí)
- 在線網(wǎng)課知慧《計算機科學(xué)素養(yǎng)(四川師大)》單元測試考核答案
- 高中學(xué)籍檔案課程學(xué)分填寫樣式-歷史化學(xué)政治
- 交通管理與控制智慧樹知到期末考試答案2024年
- 南京市旭東中學(xué)2023-2024學(xué)年中考語文全真模擬試卷含解析
- 行政事業(yè)單位如何加強預(yù)算管理
- 環(huán)保設(shè)備設(shè)施風(fēng)險分析評價記錄及風(fēng)險分級管控清單
- 做新時代的忠誠愛國者
- 機械租賃簡易招標(biāo)方案
- 工業(yè)機器人基礎(chǔ)及應(yīng)用高職全套教學(xué)課件
- 醫(yī)療器械生產(chǎn)中的質(zhì)量控制數(shù)據(jù)分析方法
評論
0/150
提交評論