go分布式 如何使用消息隊列解決分布式事務(wù)?
如何使用消息隊列解決分布式事務(wù)?有兩種選擇。Scheme 1 Local message transaction table生產(chǎn)者需要添加一個事務(wù)消息表。具體步驟如下:[1。生產(chǎn)者執(zhí)行業(yè)務(wù)邏輯并將事務(wù)
如何使用消息隊列解決分布式事務(wù)?
有兩種選擇。
Scheme 1 Local message transaction table
生產(chǎn)者需要添加一個事務(wù)消息表。具體步驟如下:[1。生產(chǎn)者執(zhí)行業(yè)務(wù)邏輯并將事務(wù)記錄插入到消息表中。這兩個操作在一個本地事務(wù)中
2。啟動后臺線程定期輪詢消息表并將消息發(fā)送到消息隊列
3。刪除消息表中的消息,直到發(fā)送成功。
方案2需要消息隊列支持,業(yè)務(wù)端提供回溯接口
1。生產(chǎn)端將準備好的消息發(fā)送到消息隊列
2。在本地事務(wù)中,業(yè)務(wù)邏輯
3。根據(jù)執(zhí)行結(jié)果確認或取消準備好的消息
4。消息隊列將確保準備好的消息被確認或取消,并且消息隊列將不斷地向生產(chǎn)端請求執(zhí)行結(jié)果,這要求生產(chǎn)端提供類似的回調(diào)函數(shù)。
在方案2中,消息隊列取代了方案1中的消息表和后臺線程輪詢功能,但并非所有消息隊列都支持此功能。支持Rocketmq。
其次,它依賴于少量的外部消息隊列開發(fā)。
傳統(tǒng)事務(wù)為什么解決不了分布式事務(wù)?
其根本原因是傳統(tǒng)事務(wù)只能解決單個事務(wù)資源的問題,而分布式事務(wù)則考慮了多個事務(wù)資源的問題。這兩種場景是不同的,傳統(tǒng)的事務(wù)無法解決分布式事務(wù)的問題。
1. 傳統(tǒng)的事務(wù)通常指數(shù)據(jù)庫事務(wù),事務(wù)資源的強一致性保證了事務(wù)的一致性。在傳統(tǒng)的單一應(yīng)用中,由于事務(wù)資源在同一個應(yīng)用中,無法跨多個事務(wù)資源調(diào)用,因此可以高效工作;
,只需要保證數(shù)據(jù)的“最終一致性”,但最終時間需要在用戶可接受的范圍內(nèi);但在金融關(guān)聯(lián)交易領(lǐng)域,仍然需要采用強一致性的方法來保證交易的準確性和可靠性。
3. 目前,分布式事務(wù)常用的解決方案有:兩階段提交、三階段提交、sagas長事務(wù)、補償模式、可靠事件模式(本地事件表、外部事件表)、可靠事件模式(非事務(wù)消息、事務(wù)消息),TCC等
不同實現(xiàn)的優(yōu)缺點如下圖所示:
科普知識@大象聊天技術(shù)
我學(xué)過Java和golang。Java已經(jīng)使用了5年,我對Java的生態(tài)、工業(yè)語言和無數(shù)解決方案有著深刻的感受。無論您是從事互聯(lián)網(wǎng)還是傳統(tǒng)行業(yè)的開發(fā),java開發(fā)總能解決很多問題。國內(nèi)巨頭阿里巴巴將java作為一種新的語音語言推向了頂峰,golang的簡單語法使用難度空前,其生態(tài)也在逐步改善,如docker etcd kubernetes Tidb、beego甚至阿里巴巴都在中國推出了Dubbo go。今天頭條、比力、滴滴等中國公司的技術(shù)堆棧已經(jīng)逐漸從Java變成了golang。不是Java不好,而是golang非常簡單。如果您開發(fā)一個包含20行代碼的web應(yīng)用程序,Java可能需要您了解完整的技術(shù)棧,比如spring引導(dǎo)棧,而golang只需要您了解httprouter。RPC框架的支持并不比Java好多少。去cicd領(lǐng)域完全是玩Java。畢竟,docker和kubernetes是由golang編寫的,它們自然得到無縫支持。Golang的并發(fā)模型也領(lǐng)先于Java。Gorouting是為并發(fā)而生的,所以現(xiàn)在學(xué)習(xí)golang是一個很好的選擇,但是golang也有它自己的優(yōu)點它的缺點是項目管理和包依賴管理不如Java,通用支持也不是很好。與Java的生態(tài)相比,go的國內(nèi)生態(tài)還很欠缺。另外,爪哇的就業(yè)比哥朗簡單,因為差距很大,但哥朗的就業(yè)工資并不低于爪哇。因此,從語言的角度來看,golang優(yōu)于Java,生態(tài)上低于Java,理論上比Java有著光明的前景,這需要看到國內(nèi)的趨勢,所以建議大家學(xué)習(xí)