如何保障微服務(wù)架構(gòu)下的數(shù)據(jù)一致性?(摘選)

寫在前面

隨著微服務(wù)架構(gòu)的推廣阵子,越來越多的公司采用微服務(wù)架構(gòu)來構(gòu)建自己的業(yè)務(wù)平臺思杯。就像前邊的文章說的,微服務(wù)架構(gòu)為業(yè)務(wù)開發(fā)帶來了諸多好處的同時挠进,例如單一職責色乾、獨立開發(fā)部署、功能復(fù)用和系統(tǒng)容錯等等领突,也帶來一些問題暖璧。

例如上手難度變大,運維變得更復(fù)雜君旦,模塊之間的依賴關(guān)系更復(fù)雜澎办,數(shù)據(jù)一致性難以保證,等等于宙。但是辦法總是比問題多浮驳,本篇文章就來介紹一下我們是如何保障微服務(wù)架構(gòu)的數(shù)據(jù)一致性的悍汛。

微服務(wù)架構(gòu)的數(shù)據(jù)一致性問題

以電商平臺為例捞魁,當用戶下單并支付后,系統(tǒng)需要修改訂單的狀態(tài)并且增加用戶積分离咐。由于系統(tǒng)采用的是微服務(wù)架構(gòu)谱俭,分離出了支付服務(wù)奉件、訂單服務(wù)和積分服務(wù),每個服務(wù)都有獨立數(shù)據(jù)庫做數(shù)據(jù)存儲昆著。當用戶支付成功后县貌,無論是修改訂單狀態(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ù)庫支持數(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ù)之數(shù)據(jù)一致性的問題,我們來聊聊分布式系統(tǒng)的 CAP 理論和 BASE 理論脱衙。

?CAP

CAP 是指在一個分布式系統(tǒng)下侥猬, 包含三個要素:Consistency(一致性)、Availability(可用性)捐韩、Partition tolerance(分區(qū)容錯性)退唠,并且三者不可得兼。

C:Consistency荤胁,一致性瞧预,所有數(shù)據(jù)變動都是同步的。

A:Availability仅政,可用性垢油,即在可以接受的時間范圍內(nèi)正確地響應(yīng)用戶請求。

P:Partition tolerance圆丹,分區(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ù)是不一致的责球,但是通過自動或手動補償后能夠達到最終的一致焦履。

?BASE

BASE 理論主要是解決 CAP 理論中分布式系統(tǒng)的可用性和一致性不可兼得的問題。BASE 理論包含以下三個要素:

BA:Basically Available雏逾,基本可用裁良。

S:Soft State,軟狀態(tài)校套,狀態(tài)可以有一段時間不同步价脾。

E:Eventually Consistent,最終一致笛匙,最終數(shù)據(jù)是一致的就可以了侨把,而不是時時保持強一致。

BASE 模型與 ACID 不同妹孙,滿足 CAP 理論秋柄,通過犧牲強一致性來保證系統(tǒng)可用性。由于犧牲了強一致性蠢正,系統(tǒng)在處理請求的過程中骇笔,數(shù)據(jù)可以存在短時的不一致。

系統(tǒng)在處理業(yè)務(wù)時嚣崭,記錄每一步的臨時狀態(tài)笨触。當出現(xiàn)異常時,根據(jù)狀態(tài)判斷是否繼續(xù)處理請求或者退回原始狀態(tài)雹舀,從而達到數(shù)據(jù)的最終一致芦劣。

例如,在上面的案例中说榆,支付成功虚吟,訂單也成功,但增加積分失敗签财,此時串慰,不應(yīng)回滾支付和訂單,而應(yīng)通過一些補償方法來讓積分得以正確地增加唱蒸。后面會講到具體的實現(xiàn)方法邦鲫。

在分享我們的分布式事務(wù)實踐方案之前,先看看早期解決分布式事務(wù)問題的二階段提交協(xié)議油宜。

二階段提交協(xié)議

X/Open DTP(Distributed Transaction Process)是一個分布式事務(wù)模型掂碱,此模型主要使用二階段提交(2PC怜姿,Two-Phase-Commit)來保證分布式事務(wù)的完整性慎冤。在這個模型里面疼燥,有三個角色:

AP:Application,應(yīng)用程序蚁堤,業(yè)務(wù)層醉者。

RM:Resource Manager,資源管理器披诗,關(guān)系型數(shù)據(jù)庫或支持 XA 接口(XA 規(guī)范是 X/Open 組織定義的分布式事務(wù)規(guī)范)的組件撬即。

TM:Transaction Manager ,事務(wù)管理器呈队,負責各個 RM 的提交和回滾剥槐。

當應(yīng)用程序(AP)調(diào)用了事務(wù)管理器(TM)的提交方法時,事務(wù)的提交分為兩個階段實行宪摧。

?第一階段(準備階段)

TM 通知所有參與事務(wù)的各個 RM粒竖,給每個 RM 發(fā)送 prepare 消息。

RM 接收到消息后進入準備階段后几于,要么直接返回失敗蕊苗,要么創(chuàng)建并執(zhí)行本地事務(wù),寫本地事務(wù)日志(redo 和 undo 日志)沿彭,但是不提交(此處只保留最后一步耗時最少的提交操作給第二階段執(zhí)行)朽砰。

?第二階段(提交 / 回滾階段)

TM 收到 RM 準備階段的失敗消息或者獲取 RM 返回消息超時,則直接給 RM 發(fā)送回滾(rollback)消息喉刘,否則發(fā)送提交(commit)消息瞧柔。

RM 根據(jù) TM 的指令執(zhí)行提交或者回滾,執(zhí)行完成后釋放所有事務(wù)處理過程中使用的鎖(最后階段釋放鎖)睦裳。

?二階段提交的利弊

優(yōu)點

2PC 提供了一套完整的分布式事務(wù)的解決方案非剃,遵循事務(wù)嚴格的 ACID 特性。

缺點

TM 通過 XA 接口與各個 RM 之間進行數(shù)據(jù)交互推沸,從第一階段的準備階段备绽,業(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ā)送待確認消息到可靠消息系統(tǒng)

可靠消息系統(tǒng)保存待確認消息并返回

上游應(yīng)用執(zhí)行本地業(yè)務(wù)

上游應(yīng)用通知可靠消息系統(tǒng)確認業(yè)務(wù)已執(zhí)行并發(fā)送消息。

可靠消息系統(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 理論的 Soft State 狀態(tài)龄章。

?下游應(yīng)用監(jiān)聽 MQ 消息并執(zhí)行業(yè)務(wù)(第二階段)

下游應(yīng)用監(jiān)聽 MQ 消息并執(zhí)行業(yè)務(wù),并且將消息的消費結(jié)果通知可靠消息服務(wù)乞封。

可靠消息的狀態(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 確認消息被消費

下游應(yīng)用通知可靠消息系統(tǒng)消息被成功消費关串,可靠消息將該消息狀態(tài)更改為已完成拧廊。

以上每一步都可能出現(xiàn)失敗情況,分析一下這 4 步出現(xiàn)異常后下游業(yè)務(wù)和消息狀態(tài)是否一致:

通過分析以上兩個階段可能失敗的情況晋修,為了確保上下游數(shù)據(jù)的最終一致性吧碾,在可靠消息系統(tǒng)中,需要開發(fā)消息狀態(tài)確認和消息重發(fā)兩個功能以實現(xiàn) BASE 理論的 Eventually Consistent 特性墓卦。

?消息狀態(tài)確認

可靠消息服務(wù)定時監(jiān)聽消息的狀態(tài)倦春,如果存在狀態(tài)為待確認并且超時的消息,則表示上游應(yīng)用和可靠消息交互中的步驟 4 或者 5 出現(xiàn)異常。

可靠消息則攜帶消息體內(nèi)的信息向上游應(yīng)用發(fā)起請求查詢該業(yè)務(wù)是否已執(zhí)行睁本。上游應(yīng)用提供一個可查詢接口供可靠消息追溯業(yè)務(wù)執(zhí)行狀態(tài)尿庐,如果業(yè)務(wù)執(zhí)行成功則更改消息狀態(tài)為已發(fā)送,否則刪除此消息確保數(shù)據(jù)一致呢堰。具體流程如下:

可靠消息查詢超時的待確認狀態(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)確認和消息重發(fā)兩個功能略荡,可以確保上游應(yīng)用、可靠消息服務(wù)和下游應(yīng)用數(shù)據(jù)的最終一致性歉胶。

當然在實際接入過程中汛兜,需要引入人工干預(yù)功能。比如引入重發(fā)次數(shù)限制通今,超過重發(fā)次數(shù)限制的將消息修改為死亡消息粥谬,等待人工干預(yù)。

代入開篇案例辫塌,通過可靠消息最終一致性方案漏策,第一階段,訂單狀態(tài)更改之前璃氢,訂單服務(wù)向可靠消息服務(wù)請求保存待確認消息哟玷。可靠消息服務(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ù)。當所有從業(yè)務(wù)服務(wù) try 成功或者某個從業(yè)務(wù)服務(wù) try 失敗時带膜,進入第二階段吩谦。

第二階段:活動管理器根據(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 失斎涑谩:則回滾所有 confirm 操作并執(zhí)行 cancel 操作。

Cancel 失斝凉荨:從業(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ù)增積分间影,從而,保證訂單和積分數(shù)據(jù)的最終一致性茄茁。

通過上面的對可靠消息服務(wù)和 TCC 方案的描述魂贬,我們解決了技術(shù)棧一致和不一致的兩種情況下的數(shù)據(jù)一致性問題。

但是裙顽,通常在這些核心業(yè)務(wù)上有很多附加業(yè)務(wù)付燥,比如當用戶支付完成后,需要通過短信通知用戶支付成功愈犹。

這一類業(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)用成功,則該消息標記為通知成功葛假,如果失敗則在滿足通知規(guī)則(例如 5 分鐘發(fā)一次障陶,共發(fā)送 10 次)的情況下重新放入延時隊列等待下次觸發(fā)。

最大努力通知服務(wù)表示在不影響主業(yè)務(wù)的情況下聊训,盡可能地確保數(shù)據(jù)的一致性抱究。它需要開發(fā)人員根據(jù)業(yè)務(wù)來指定通知規(guī)則,在滿足通知規(guī)則的前提下带斑,盡可能的確保數(shù)據(jù)的一致鼓寺,以盡到最大努力的目的。

根據(jù)不同的業(yè)務(wù)可以定制不同的通知規(guī)則勋磕,比如通知支付結(jié)果等相對嚴謹?shù)臉I(yè)務(wù)妈候,可以將通知頻率設(shè)置高一些,通知時間長一些挂滓,比如隔 5 分鐘通知一次苦银,持續(xù)時間 1 小時。

如果不重要的業(yè)務(wù)杂彭,比如通知用戶積分增加墓毒,則可以將通知頻率設(shè)置低一些,時間短一些亲怠,比如 10 分鐘通知一次所计,持續(xù) 30 分鐘。

代入上面提到的支付成功短信通知用戶的案例团秽,通過最大努力通知方案主胧,當支付成功后叭首,將消息發(fā)送到 MQ 中間件,在消息中踪栋,定義發(fā)送規(guī)則為 5 分鐘一次焙格,最大發(fā)送數(shù)為 10 次。

最大努力通知服務(wù)監(jiān)聽 MQ 消息并根據(jù)規(guī)則調(diào)用消息通知服務(wù)(短信服務(wù))的消息發(fā)送接口夷都,并記錄每次調(diào)用的日志信息眷唉。在通知成功或者已通知 10 次時,停止通知囤官。

總 * 結(jié)

上面通過案例詳細介紹了我們解決微服務(wù)之間數(shù)據(jù)不一致問題的三種方案冬阳,下面通過一張簡單的對比圖,為大家選擇合適的解決方案提供簡單依據(jù)党饮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肝陪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子刑顺,更是在濱河造成了極大的恐慌氯窍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹲堂,死亡現(xiàn)場離奇詭異狼讨,居然都是意外死亡,警方通過查閱死者的電腦和手機贯城,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門熊楼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人能犯,你說我怎么就攤上這事∪埽” “怎么了踩晶?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枕磁。 經(jīng)常有香客問我渡蜻,道長,這世上最難降的妖魔是什么计济? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任茸苇,我火速辦了婚禮,結(jié)果婚禮上沦寂,老公的妹妹穿的比我還像新娘学密。我一直安慰自己,他們只是感情好传藏,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布腻暮。 她就那樣靜靜地躺著彤守,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哭靖。 梳的紋絲不亂的頭發(fā)上具垫,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音试幽,去河邊找鬼筝蚕。 笑死,一個胖子當著我的面吹牛铺坞,可吹牛的內(nèi)容都是我干的饰及。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼康震,長吁一口氣:“原來是場噩夢啊……” “哼燎含!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起腿短,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤屏箍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后橘忱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赴魁,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年钝诚,在試婚紗的時候發(fā)現(xiàn)自己被綠了颖御。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡凝颇,死狀恐怖潘拱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拧略,我是刑警寧澤芦岂,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站垫蛆,受9級特大地震影響禽最,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜袱饭,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一川无、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虑乖,春花似錦懦趋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽走贪。三九已至,卻和暖如春惑芭,著一層夾襖步出監(jiān)牢的瞬間坠狡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工遂跟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逃沿,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓幻锁,卻偏偏與公主長得像凯亮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哄尔,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容