base cap 分布式_干貨分享:基于本地消息表的分布式事務解決方案總結

前段時間學習了分布式事務的幾種方案,下面主要總結下基于本地消息表實現可靠消息最終一致性的分布式事務方案。

1,什么是分布式事務?

在傳統架構中往往是一個單體架構,一個系統就對應一個war包,然后這個系統也只有一個數據庫。即一個應用對應一個數據庫,此時能滿足傳統的數據庫事務,滿足ACID的強一致性。后來,由于業務需求或其他原因,此時一個應用系統操作兩個數據庫(雖然這個在微服務規范中是不合理的)即一個應用要操作兩個資源,此時就不能用傳統的事務了。此時就需要用到分布式事務,XA事務。再到后來,為了解耦或其他原因,此時一個應用系統需要拆分成兩個子系統,其中一個系統對應一個庫,此時也需要用到分布式事務。

講到了分布式事務,自然離不開分布式系統的一些基本原則和定理,下面接著來介紹分布式系統的CAP原則和BASE理論。

2,CAP原則

CAP理論描述了分布式系統中的基本原則,其中C是指Consistency(一致性),A是指Availability(可用性)和P是指Partition tolerance(區分容錯性)。CAP原則指CAP三者不能同時滿足,要么能同時滿足CP即同時滿足區分容錯性和一致性,要么同時滿足AP即同時滿足區分容錯性和可用性。從中可以看出,P是分布式系統的基礎,沒有區分容錯性就談不上分布式系統了。

CAP只能滿足AP或CP的原因是,分布式節點之間通常存在一個數據拷貝的過程,在這一個過程中是只能滿足AP或者CP的。舉個例子好了,比如redis分布式集群中,當一個寫請求打到一個主節點上,幾乎同時另一個讀請求打到redis這個主節點的對應從節點上,此時請問該從節點能返回剛才寫在主節點的數據嗎?若要保證CP,此時數據正在從主節點復制到從節點的路上,此時該節點的該數據是不可用的;若要保證AP,因為數據正在從主節點復制到從節點的路上,因此節點間的數據狀態是不一致的。

3,BASE理論

前面講到分布式系統的CAP原則要么同時滿足AP要么同時滿足CP,那么BASE理論則是CAP原則權衡的結果。BASE是指Basically Available(基本可用的),Soft state(軟狀態),Eventual consistency(最終一致性)。

Basically Available是指在分布式集群節點中,若某個節點宕機,或者在數據在節點間復制的過程中,只有部分數據不可用,但不影響整個系統的整體的可用性。

Soft state是指軟狀態即這個狀態只是一個中間狀態,允許數據在節點集群間操作過程中存在存在一個時延,這個中間狀態最終會轉化為最終狀態。

Eventual consistency是指數據在分布式集群節點間操作過程中存在時延,與ACID相反,最終一致性不是強一致性,在經過一定時間后,分布式集群節點間的數據拷貝能達到最終一致的狀態。

4,基于本地消息表常用的分布式事務解決方案

上面提到了分布式系統中要實現強一致性比較困難,往往很多業務場景不要求強一致性,允許有個臨時的業務中間狀態。因此就可以采用最終一致性的分布式事務方案。

常用的分布式解決方案有實現XA事務的Atomikos,本地消息表方案,基于消息中間件的最終一致性方案,TCC方案,阿里的SEATA,SAGA方案和最大努力通知。下面主要對基于本地消息表實現最終一致性的分布式事務方案進行介紹。

本地消息表方案最初是ebay提出的,其實也是BASE理論的應用,屬于可靠消息最終一致性的范疇。這里以支付服務和會計服務為例展開介紹本地消息表方案,大概流程是這樣子:用戶在支付服務完成了支付訂單支付成功后,此時會調用會計服務的接口生成一條原始的會計憑證到數據庫中,如圖1所示。這里必須明確:支付服務處理完訂單支付等邏輯后,此時若直接調用會計服務生成會計憑證數據的接口肯定會遇到分布式事務的問題。

efd00fdf3346154df45bdca6de403dab.png

因為用戶完成支付后,此時得立馬給用戶一個支付的反饋,要做的就是提醒用戶支付成功。因為會計服務生成的會計憑證保存到數據庫的過程中可以對用戶透明,用戶也無需知道有這么一個流程,為了提高響應速度和解耦,因此可以引入mq來做到異步生成會計憑證,即用戶完成支付訂單支付后,此時可以將消息投遞到mq中,然后會計服務再去監聽mq消息去處理消費邏輯。此時如圖2:

56f8d0484a0afb3703b73c25a3b9eca2.png

在支付服務和會計服務之間引入mq后,此時又引入了新的問題。大概列舉如下:

1,若支付服務完成支付邏輯后,在投遞消息到mq中間件的過程中由于網絡抖動等原因,沒有投遞到mq中導致消息丟失了怎么辦?

2,mq接收到消息后,由于內部原因導致消息丟失了怎么辦?

3,會計服務在監聽消息的過程中,由于網絡原因沒有接收到消息或消費過程中遇到異常,此時也會導致消息丟失,測試怎么辦?

經過以上分析,mq可能會丟失消息,傳統的mq沒有實現分布式事務(注意rocketmq的某些版本有實現分布式事務功能),因此這里可以引入本地消息表結合mq的方式來解決分布式事務的問題,保證消息的可靠投遞。

圖3是由圖2細化后的圖,其中紅框處引入了一個本地消息表。

a94464a641156c665fe7fa877af759f0.png

根據圖3,正向流程步驟大概如下:

1)在支付庫中引入一張消息表來記錄支付消息,即用戶支付成功后同時往這張消息表插入一條支付成功的消息,狀態為“發送中”。注意支付邏輯和插入消息表的代碼要包裹在一個事務里面,這里保證了本地事務的強一致性。即支付邏輯和插入消息表的消息組成了一個強一致性的事務,要么同時成功,要么同時失敗。

2)完成 1)步的邏輯后,此時再向mq的PAY_QUEUE隊列中投遞一條支付消息,這條支付消息的內容跟保存在支付庫消息表的消息內容一致。

3)mq接收到消息后,此時會計服務也監聽到這條消息了,此時會計服務處理消費邏輯即開始生成會計憑證。

4)會計憑證生成后,再反向向mq投遞一條消費成功的消息到ACC_QUEUE隊列

5)同時支付服務又來監聽這個會計服務消費成功的消息,當支付服務監聽到這個消費成功的消息后,此時再將本地消息表的消息狀態改為“已發送”。

6)經過前面5步后,整個業務就已經完成了。

以上是引入本地消息表后的正常的業務流程,前文分析過生產者,mq和消費者三個環節中都可能弄丟消息,即圖4中的紅框處可能會造成消息丟失。

85d12d92b77a7c36f9371ff000858b21.png

此時可能你會有個疑問:用戶支付成功后,若消息在投遞過程中丟失了就丟失了,會計服務那邊也消費不到了,此時同樣也會造成支付服務(生產者)和會計服務(消費者)之間的數據不一致。

之前增加的本地消息表好像也沒起作用啊?

那此時怎么辦呢?如何來解決消息丟失的問題,做到消息的可靠投遞呢?

其實解決方案就是消息重復投遞,但消費者的消費接口要實現冪等性。

怎么來讓消息重復投遞呢?此時本地消息表就派上用場了,剛才我們在支付庫中新增加了一張本地消息表,即支付等邏輯處理成功,這張本地消息表也會記錄一條記錄,此時的消息狀態是“發送中”。若第一次生產者投遞的消息丟失后,此時我們只要將這張本地消息表狀態為“發送中”的消息重新投遞即可,直到消費者消費成功為止,消費者消費成功后將這條消息的狀態改為“已發送”即可。

因此為了能將丟失后的消息重發,此時我們引入一個定時任務好了,暫且叫它“消息恢復系統”吧,如下圖所示。這個消息恢復系統就是每隔一段時間去本地消息表中撈取狀態為“發送中”的消息,然后重新投遞到mq中間件中,然后消費者就會重新消費了。若消費者已經消費過了,此時就不再處理消費業務邏輯,直接反向投遞一條消費成功的消息到mq中,此時原來的生產者此時也會監聽這條消費成功的消息,將本地消息表的消息狀態改為“已發送”,此時消息恢復系統就不會再去撈取這條狀態為“已發送”的消息,然后進行重新投遞了。

d0bd75dc6cccd1d71630ab23dbaaaa93.png

此時若消息丟失后且消息恢復系統在重新投遞過程中,也可能會再次投遞失敗。此時我們一般會指定最大重試次數,重試間隔時間根據重試次數而線性增長。若達到最大重試次數后,同時記錄日志,我們可以根據記錄的日志來通過郵件或短信來發送告警通知,接收到告警通知后及時介入人工處理即可。

基于本地消息表的分布式事務方案就介紹到這里了,本地消息表的方案的優點是建設成本比較低,其雖然實現了可靠消息的傳遞確保了分布式事務的最終一致性,其實它也有一些缺陷:

1)本地消息表與業務耦合在一起,難于做成通用性,不可獨立伸縮。

2)本地消息表是基于數據庫來做的,而數據庫是要讀寫磁盤IO的,因此在高并發下是有性能瓶頸的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532143.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532143.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532143.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

google protobuf_protobuf 指南

簡介安裝語言定義特殊指令定義服務JSON 支持選項生成代碼基礎類型更新 messageGolang 下使用參考簡介Protocol Buffers 是 google 出品的一種數據交換格式, 縮寫為 protobuf.主要介紹 proto3 版本和 Golang 下的使用.安裝protobuf 分為編譯器和運行時兩部分. 編譯器直接使用預編…

計算機無法裝補丁,電腦無法安裝kb4012212補丁如何處理|電腦無法安裝kb4012212補丁的處理方法...

最近,不少用戶的電腦都被《永恒之藍》病毒侵襲,因此微軟官方推出了預防補丁 — kb4012212,正常系統只要安裝該補丁就能避免電腦遭到傷害。不過,有用戶反饋自己遇到了電腦無法安裝kb4012212補丁的情況,該怎么辦呢&#…

shell181網格劃分_ANSYS中SHELL181單元理解和參數詳解?-

頂部和底部的平均值不合適的時候,你應該用這個選項來得到正確的中見面的結果(薄膜結果);例子中包含黑線性材料特性的中間面應力、應變 ,以及在包含諸如譜分析等測長操作的模態疊加之后的中間面結果。 KEYOPT(9) 1 用來從用戶子程序中讀取初始厚度數據。…

使用計算機繪制景物圖像的兩個主要步驟是,計算機11考試.doc

文檔介紹:第五章[4]. 一張CD盤片上存儲的立體聲高保真全頻帶數字音樂約可播放一小時,則其數據量大約是______。A、800MBB、635MBC、400MBD、1GB[6]. 衛星數字電視和新一代數字視盤DVD采用______作為數字視頻壓縮標準。MPEG-2 | MPEG2[10]. 聲卡在計算機中用于完成聲…

mysql在哪里寫代碼_[譯] 如何寫好 Go 代碼

原文:https://scene-si.org/2018/07/24/writing-great-go-code/我寫了多年的 Go 微服務,并在寫完兩本關于 (API Foundations in Go 和 12 Factor Applications with Docker and Go) 主題的書之后,有了一些關于如何寫好 Go 代碼的想法但首先&a…

學畫畫軟件app推薦_路由器管理軟件哪個好?6款路由器管理APP推薦_軟件評測

無限網絡應用越來越廣泛,由此應運而生了許多可以蹭網的軟件,家里的網速突然變慢了,也許就是隔壁的小哥哥小姐姐在蹭網絡,那么如何避免被蹭網?今天小編給各位小伙伴推薦幾款路由器管理軟件,發現網絡變慢了&a…

408計算機考研 各科題目題號,2021考研408計算機專業基礎綜合數據結構試題特點分析...

2021考研408計算機專業基礎綜合數據結構試題特點分析2021考研初試結束后,新東方在線考研網為各位考研考生梳理"2021考研408計算機專業基礎綜合數據結構試題特點分析"內容,同時新東方在線考研各研究院院長針對2021考研各科目試題變化及難度進行…

各個圖標的意思_冬奧體育圖標設計團隊負責人林存真:每一個圖標要畫100稿以上...

林存真中央美術學院設計學院副院長、北京冬奧組委文化活動部形象景觀藝術總監、北京冬奧會體育圖標設計團隊負責人。12月31日晚,北京2022年冬奧會和冬殘奧會體育圖標正式發布。在體育圖標發布前夕,新京報記者采訪了北京冬奧會體育圖標設計團隊的負責人&a…

delphi制作上下開幕效果_2019中超聯賽揭幕戰在深圳舉行 現場開幕式亮點多多

3月2日晚,2019中超聯賽開幕式在深圳大運中心體育場舉行。隨著中國足協黨委書記杜兆才正式宣布2019年中超聯賽開幕,以“超精彩”為口號的2019新賽季中超聯賽正式打響。本賽季中超聯賽是出臺“注資帽”、“薪酬帽”、“獎金帽”、“轉會帽”之后的第一個賽…

ae正在發生崩潰_AE錯誤:正在發生崩潰的解決方法,原創問題解決方案

AE在使用過程中,可能會出現一些問題。有的問題是莫名其妙出現。例如剛剛還在正常使用AE軟件,下一次再打開的時候就會出現問題。今天給大家說的是如何去解決after effects錯誤:正在發生崩潰這個問題 。該問題所提供的解決方法為實際操作過,并成功解決。所以才寫出來給大家提…

計算機二級公共,計算機二級公共基礎知識

計算機二級公共基礎知識計算機二級考試包括計算機基礎知識。雖然分值不高但是我們還是要把握好每一分。下面百分網小編整理了相關計算機二級公共基礎知識,希望大家喜歡。計算機二級公共基礎知識1.1棧和隊列1、棧及其基本運算棧是限定在一端進行插入與刪除運算的線性…

echarts map 點擊地圖區域變色_繪制炫酷的地圖,不只是pyecharts.map!

導讀:地圖可視化是一種非常直觀的數據分析結果展現形式,python有很多可視化庫可以實現,pyecharts就是很多python愛好者喜愛的實現地圖可視化方法之一。不可否認,pyecharts繪制的地圖實現方便、圖形美觀而且支持交互,但…

金蝶kis專業版公網訪問_金蝶KIS云專業版—【賬務處理】進階操作101問

對KIS專業版【賬務處理】模塊日常操作之外的各種問題進行回答,幫助老師們快速進階此模塊的操作,提高軟件的便利性。1.專業版資產負債表如何移動表頁位置?【操作步驟】 1、單擊【報表與分析】-【資產負債表】;2、單擊左上角菜單欄【…

奧鵬東師計算機應用基礎18,免費在線作業答案奧鵬東師計算機應用基礎15秋在線作業1試卷及答案(1)...

奧鵬東師計算機應用基礎15秋在線作業1試卷及答案(1)一、單選題(共25道試題,共62.5分。)1.在Excel 中保存的工作簿默認的文件擴展名是()。A. XLSB. DOCC. DBFD. TXT正確答案:A2.中文Windows 2000的“桌面”是指()。A. 整個屏幕B. 某個窗口2015奧鵬作業答案…

es集群搭建_滴滴Elasticsearch 集群跨版本升級與平臺重構之路

前不久,滴滴ES團隊將維護的30多個ES集群,3500多個ES節點,8PB的數據,從2.3.3跨大版本無縫升級到6.6.1。在對用戶查詢寫入基本零影響和改動的前提下,解決了ES跨大版本協議不兼容、文件格式不兼容、mapping不兼容等難題&a…

電子工程可以報考二建_非工程類專業也能報考二建嗎?

非工程類專業也能報考二建嗎?2020年非工程類專業能考二級建造師的省份匯總整理!2020年二級建造師考試報名公告陸續公布中,目前江西、陜西、江蘇三省公布了報名時間,其他省份報名時間暫時未確定。四川省已經受疫情影響推遲五月的考…

計算機考試中英文打字題,計算機信息技術(五筆及中英文打字測試試題)

計算機信息技術(五筆及中英文打字測試試題) (14頁)本資源提供全文預覽,點擊全文預覽即可全文預覽,如果喜歡文檔就下載吧,查找使用更方便哦!14.9 積分第一章基本知識習題答案一、填空題1. 計算機信息高新技術考試劃分為五、四、三、二、_ 5個等…

pil python 安裝_20行Python代碼給微信頭像戴帽子

作者 | Leauky,北理工碩士在讀,非CS專業的Python愛好者。朋友圈里微信官方要求戴圣誕帽的活動曾經火爆一時,有些會玩的小伙伴都悄咪咪地用美圖秀秀一類的 app 給自己頭像 p 一頂,然后可高興地表示“哎呀好神奇hhhh”,呆…

arcgis 屬性表 匯總_Arcgis中遙感影像地理配準、矢量化與地圖制作

目的:將遙感圖像進行地理配準、矢量化,并且制作地圖。要求:對的遙感圖像進行地理配準;矢量化建筑物、綠地、道路、水體等主要地物要素;對各類地物要素進行符號化設置并對其名稱進行標注;添加指北針、比例尺…

怎么查看計算機的系統內存大小,Windows10系統怎么查看電腦內存大小

很多用戶在升級到windows10系統之后,因為很多界面和操作都跟之前的Windows系統不一樣,所以很多操作都不知道要如何下手,比如想要查看電腦內存大小的時候卻不知道要怎么操作,其實方法很簡單,下面給大家介紹一下Windows1…