溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

發(fā)布時間:2021-08-06 15:16:32 來源:億速云 閱讀:187 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關(guān)Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

在上圖中,TDB會有兩個表。也就是說,事務(wù)補(bǔ)償能夠成功實現(xiàn),主要靠TDB中的這兩張表!:

  • 事務(wù)狀態(tài)表(記錄事務(wù)組狀態(tài);txid、state、timestap)、

  • 事務(wù)調(diào)用組表(記錄事務(wù)組中每一次調(diào)用和相關(guān)參數(shù);txid、actionid、callmethod、pramatype、params)。

接下來,我們介紹上面兩個表每個字段的含義:txid是主鍵、state表示事務(wù)狀態(tài)(例如:1開始 2成功  3失敗  4補(bǔ)償成功 )、actionid是操作次數(shù)的id、callmethod是補(bǔ)償接口、調(diào)用服務(wù)的類型(如web/RPC)、params是具體數(shù)據(jù)包的調(diào)度參數(shù)。

而事務(wù)補(bǔ)償,就是當(dāng)事務(wù)調(diào)用失敗,事務(wù)攔截器修改事務(wù)組狀態(tài)(state)。然后由TM發(fā)起,分布式事務(wù)補(bǔ)償服務(wù)異步執(zhí)行補(bǔ)償。

上面的內(nèi)容比較抽象,我們結(jié)合場景進(jìn)行說明,還是以下圖為例。

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

大魏在京東購物,這是一個分布式事務(wù)。這個時候,proxy生成事務(wù)組表的一行數(shù)據(jù),并且記錄(t1代表分布式事務(wù)1):

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

接下來,要正式干活兒了。Proxy記錄事務(wù)A的調(diào)用信息,寫入事務(wù)組表:

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

記錄完畢后,A做本地事務(wù):

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

A執(zhí)行成功后,Proxy用類似的方式管理B,以此類推C。

Proxy在事務(wù)調(diào)用表中記錄B的調(diào)用內(nèi)容:

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

B本地事務(wù)執(zhí)行:

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

Proxy在事務(wù)調(diào)用表中記錄C的調(diào)用內(nèi)容:

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

然后C執(zhí)行。

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

當(dāng)C本地事務(wù)執(zhí)行成功后,Proxy將會修改TDB中的信息:

修改前:

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

修改后:

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

也就是說,標(biāo)記分布式事務(wù)執(zhí)行成功。

但是,如果在上面的步驟中,C執(zhí)行失敗呢?

首先,Proxy會將TDB中的事務(wù)組表進(jìn)行如下修改,將狀態(tài)從1開始修改為3失敗:

修改前:

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

修改后:

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

接下來,Schedule(即TM)會掃描到(定期掃描)t1失?。顟B(tài)為3)。然后Schedule發(fā)現(xiàn)T1在事務(wù)調(diào)用表有2個關(guān)聯(lián)的本地事務(wù)(C做失敗已經(jīng)自動rollback)

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

接下來,根據(jù)事務(wù)調(diào)用表中的pramatype字段,RPC Client調(diào)用補(bǔ)償接口,對事務(wù)進(jìn)行補(bǔ)償。

先補(bǔ)償B:

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

再補(bǔ)償A:

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

最后,補(bǔ)償完畢后,proxy修改TBD中的事務(wù)組表,將state從3改成4,代表補(bǔ)償成功。

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

我們上述邏輯,結(jié)合業(yè)務(wù)邏輯組件進(jìn)行結(jié)合。這次我們把業(yè)務(wù)邏輯模塊換一下。京東購物,選中貨物后,庫存會被鎖?。ˋ)、然后支付的時候,會選擇紅包或者京東卡,會有減紅包或減京東卡余額的操作(C)、最后成功創(chuàng)建訂單(C)。

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

具體參考下圖:

Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么

總結(jié):在本文中,我們介紹了Saga的業(yè)務(wù)實現(xiàn)邏輯。關(guān)于Proxy的作用:

Proxy的實現(xiàn),在Java中是通過@around實現(xiàn)的。

  • 交易業(yè)務(wù)邏輯層加注解,SpringBoot可以基于@tx(可以和@around協(xié)同工作)和@Transactional(通過攔截器TransactionInterceptor實現(xiàn))。

  • Proxy 作為攔截器,它在真正業(yè)務(wù)邏輯被調(diào)用之前 , 生成一 個全局唯一TXID 標(biāo)示事務(wù)組, TXID 保存在全局變量里,  事前攔截器寫入,并向 TDB 寫入 TXID 并把事務(wù)組置為開始狀態(tài),完成業(yè)務(wù)操作后清除 TXID 標(biāo) 識.

  • 交易業(yè)務(wù)邏輯層調(diào)用數(shù)據(jù)訪問前,通過 RPCProxy代理記錄當(dāng)前調(diào)用請求上下文參數(shù)。

  • 如果業(yè)務(wù)成功,調(diào)用記錄刪除

  • 如果調(diào)用異常,根據(jù)記錄反向補(bǔ)償

看完上述內(nèi)容,你們對Sagas的業(yè)務(wù)實現(xiàn)邏輯是什么有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI