編程語言排行榜「go語言實戰項目」

我們團隊在引入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都執行成功,時序圖如下:

分布式事務實戰--go語言的saga事務

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

分布式事務實戰--go語言的saga事務

如果您需要進一步了解上述例子,可以移步yedf/dtm 能夠讓您快速運行一個saga事務

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/256014.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-15 12:32
下一篇 2024-12-15 12:32

相關推薦

發表回復

登錄後才能評論