Seata-golang grpc 通信版本與 Transaction Mesh
分佈式事務簡介
在這裏簡單介紹下分佈式事務的原理:
-
事務的發起者(TM)要向事務協調器(TC)發起開啓全局事務的請求
-
在業務執行完畢後,事務的發起者(TM)向事務協調器(TC)發起全局事務提交或者全局事務回滾
-
在全局事務開啓後,事務的參與者(RM)要向事務協調器(TC)註冊分支事務
-
RM 本地業務執行完畢後,要向事務協調器(TC)報告分支事務的執行狀態,即本地事務執行成功還是失敗
-
事務協調器(TC)在收到全局提交或者全局回滾的請求後,會通知執行成功的事務參與者(RM)執行本地提交或者本地回滾
所以,TM 到 TC 都是發起單向的請求,RM 和 TC 之間的通信是雙向的。
seata-golang 歷史問題
從 2020 年 4 月 開始正式開源了 seata-golang 分佈式事務框架,功能基本對齊 seata(java)。
需要着重強調的是:
-
爲了雙向通信,seata-golang 底層網絡庫使用的是 getty。(核心網絡庫:
http://seata.io/zh-cn/blog/seata-golang-communication-mode.html dubbogo )
-
在 TC 上保存了 client 的連接註冊信息,在需要回調時,TC 才能準確地向對應的 client 發起回調請求。
-
爲了 TC 的高可用,client 端需要保存每個 TC 的連接註冊信息,以便在其中一個 TC 當機後選擇另一個 TC 通信。
這個版本目前已經完全穩定,同時也在積極的改進中,支持了更多的特性,吸引了一些企業用戶深度參與其中。
不過隨着雲原生時代的到來,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 端將 TC 的在 kubernetes 中的域名和端口配置到 serverAddressing,並將自己在 kubernetes 中的域名和端口配置到 addressing
-
在 client 端和 TC 用 grpc 進行通信的時候,使用 serverAddressing 去對 TC 進行服務發現
-
TC 在回調 client 端時,通過 addressing 來對 client 進行服務發現。
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 源碼閱讀與實戰系列教程,擅長微服務相關事宜。
參考資料
-
seata 官方:https://seata.io
-
java 版 seata:https://github.com/seata/seata
-
seata-golang 項目地址:
https://github.com/opentrx/seata-golang
-
driver 地址:https://github.com/opentrx/mysql
-
seata-golang go 夜讀 b 站分享:
https://www.bilibili.com/video/BV1oz411e72T
-
基於 getty 的 seata-golang 通信模型詳解:
http://seata.io/zh-cn/blog/seata-golang-communication-mode.html
-
seata-golang 接入指南:
-
Go Mysql Driver 集成 Seata-Golang 解決分佈式事務問題:
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/Hl4Un-1wvOpmSn0eAGELFw