我們團隊在引入go語言做微服務的過程中,遇見了分散式事務的強需求。我們的交易中心涉及大量的業務,包括了商品、庫存、各類營銷活動、商品許可權等等,按照我們微服務的設計,需要拆分到多個微服務。原先由本地事務保證的ACID,現在需要分散式事務方案來保證交易的正確性。
我們調研了大量開源項目,發現只有java提供了分散式事務的中間件,其他語言,暫未發現成熟的方案。這種背景下,我們內部開發了針對go語言分散式事務的DTM項目,線上穩定之後,我們將它開源出來,github地址為:yedf/dtm 。
雖然DTM最初針對我們的go語言微服務,但是我們的設計方案,充分考慮了跨語言特性,將底層通信設計成HTTP(未來會支持grpc),並且將客戶端做的非常輕,代碼量非常少。
下面我們來看一個Go語言接入DTM的簡單例子:
const DtmServer = "http://localhost:8080/api/dtmsvr"
const startBusi = "http://localhost:8081/api/busi_saga"
req := &gin.H{"amount": 30} // 微服務的負荷
// 生成dtm的saga對象
saga := dtm.SagaNew(DtmServer).
// 添加兩個子事務
Add(startBusi+"/TransOut", startBusi+"/TransOutCompensate", req).
Add(startBusi+"/TransIn", startBusi+"/TransInCompensate", req)
// 提交saga事務
err := saga.Commit()
上述提交到dtm的saga事務,包括了兩個子事務,TransOut和TransIn,以及兩個子事務對應的補償事務。事務提交到DTM後,DTM保證TransOut TransIn要麼全部執行成功,要麼任何一個子事務失敗,會將執行過的子事務,再執行相應的補償事務。
如果TransOut、TransIn都執行成功,時序圖如下:

如果TransOut成功、而TransIn失敗,時序圖如下:

如果您需要進一步了解上述例子,可以移步yedf/dtm 能夠讓您快速運行一個saga事務
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/256014.html