Seata-golang grpc 通信版本與 Transaction Mesh

分佈式事務簡介

在這裏簡單介紹下分佈式事務的原理:

所以,TM 到 TC 都是發起單向的請求,RM 和 TC 之間的通信是雙向的。

seata-golang 歷史問題

從 2020 年 4 月 開始正式開源了 seata-golang 分佈式事務框架,功能基本對齊 seata(java)。

需要着重強調的是:

這個版本目前已經完全穩定,同時也在積極的改進中,支持了更多的特性,吸引了一些企業用戶深度參與其中。

不過隨着雲原生時代的到來,kubernetes 被廣泛的使用,seata-golang v1 版本的設計並不完全符合雲原生的理念。

首先,client 需要知道每個 TC 的連接地址,並與每個 TC 保持連接,TC 也將每個 client 的連接信息保存在內部。在 kubernetes 環境下,每個容器重啓後由於 ip 地址重新分配,client 要知道 TC 的 IP 地址必須依靠註冊中心。

其次,RPC 協議採用了自己實現的編碼協議,對協議棧的擴展不友好,對接入雲原生產品增加了難度。

seata-golang grpc 版本

基於上述原因,我在今年 6 月使用 grpc 將 seata-golang 重構了一個版本。

(v2 版本:https://github.com/opentrx/seata-golang/tree/v2)

大概流程如下:

client 端配置如下:

port: 8083 #分支事務暴露的端口,用於 TC 回調
addressing: aggregation.default.svc:8083 #client 端在 kubernetes 中的域名及端口
serverAddressing: seata.default.svc:8091 #TC 部署在 kubernetes 中的域名及端口

Transaction Mesh

Transaction Mesh 是一個美好的夢想,去年我在將 seata-golang 開源後就一直在思考怎麼實現 transaction mesh。其實當時思路已經成型,但由於認識瞭解 seata-golang 的人比較少,我也擔心我在閉門造車,就將這個想法擱置了。

今年 4 月、5 月,有幸得到 GOCN 社區和阿里的支持,在線下和許多開發者進行了面對面的交流,並且 seata-golang 也有了商業用戶,通過交流認爲 Transaction Mesh 還是有必要去實現的。

所以最近我又將 Seata-golang 的 TCC 模式集成到了 Mosn 中(pr 正在 review:

https://github.com/mosn/mosn/pull/1728 ),下面是 Mosn 集成 TCC 模式的原理圖。

之所以選擇 Mosn 而不是 Envoy 是因爲自從畢業後就很少接觸 C++,在 Envoy 上集成有些力不從心。而 Seata-golang 已經定義好和 TC 交互的 grpc 接口描述語言 seata.proto,要在 Envoy 上完成 Transaction Mesh 可以參考 Mosn 的實現,熟悉 C++ 對 Transaction Mesh 感興趣的朋友,歡迎您來完成這個美好的夢想!

如果你有任何疑問,歡迎釘釘掃碼加入交流羣【釘釘羣號 33069364】:

作者簡介

劉曉敏 (GitHubID dk-lockdown),目前就職於 h3c 成都分公司,擅長使用 Go/Java 語言,在雲原生和微服務相關技術方向均有涉獵,目前專攻分佈式事務。

郝洪範 (GitHubID georgehao),dubbogo committer,目前就職於京東,擅長使用 Go/C++ 語言,目前在輸出 Go 源碼閱讀與實戰系列教程,擅長微服務相關事宜。

參考資料

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Hl4Un-1wvOpmSn0eAGELFw