參與 Seata 社區到 go 與 Seata 的邂逅
- 2020 年 4 月 27 日
- 筆記
- seata, seata-golang, 分散式事務
眾所周知,這幾年微服務、雲原生提得很火熱。2017年,當時公司的領導劉巍,敏銳得提出公司轉型微服務。那時,提到微服務大家一頭霧水,經過兩年的實踐,逐漸有了一些心得。但有個問題始終縈繞在微服務開發者的頭上,分散式事務到底如何解決,有沒有比較完美的方案?二階段提交、柔性事務、最終一致性?
2019 年,我注意到阿里巴巴的同學在社區調研分散式事務需求,立即加入了社區群。在 seata 0.2 版本的時候,當時還不叫 seata,叫 fescar,我看到 seata 程式碼倉庫里只有 dubbo 結合 seata 的 sample,隨即在部落格園寫了一篇 spring boot 如何結合 seata 的博文 Spring Boot微服務如何集成seata解決分散式事務問題? ,這篇文章後來被收錄到 seata wiki 裡面,收穫到了 18000+ 的閱讀量,是我閱讀量最高的一篇部落格。
後來,由於工作比較忙,屢次想參與 seata 貢獻,發現了幾個 bug,本來想修改來著,結果看社區裡邊已經有人在做了😂。
由於接觸微服務,自然而然接觸到 k8s 技術,接觸到雲原生,接觸到 golang。個人對 golang 比較感興趣,比較看好它的未來。看到社區裡面也有關於 seata go client 的呼聲,遂萌生了打造 golang 版 seata 的想法。
有人問:喂,同學,我技術差,不懂 seata,我能參與 seata-golang 項目嗎?其實我剛開始寫 seata-golang 的時候也有這樣的疑問,我接觸 golang 不久,seata 有些細節也不是太明白,我怎麼開始?其實掌握到方法論,開始就不難了。首先,掌握幾個概念,TC(Transaction Coordinator)、TM(Transaction Manager)、RM(Resource Manager);然後弄明白這幾個概念是幹什麼的,下面這張圖就很好的概括了他們的職責、功能。清楚這些東西後,就是抽象介面啦。介面抽象出來後,就實現,seata 裡面那麼多的實現,通訊序列化協議有 seata、protobuf、jackson、kryo、hessian、fst,sesssion manager 有基於記憶體的,也有基於 DB 的,先選擇最簡單你最有把握的實現。
目前 seata-golang 版本,已經實現基於記憶體的事務數據管理(session manager),client 端已經實現 TCC 模式。AT 模式的實現還有些細節沒有考慮好,比如 sql 解析,主鍵如何處理等;metrics 收集器還未考慮;從配置中心讀取配置等。這些問題,都是值得思考並參與貢獻的。
源碼👇seata-golang
TC Server 調試
-
先在 Goland 配置環境變數,配置為 config.yaml 文件的絕對路徑
-
運行 main.go,系統默認監聽 8091 埠。
-
Demo 客戶端的程式碼👇seata-demo,設置service.localRgroup.grouplist = “127.0.0.1:8091″,運行 demo 即可調試。
目前,Java client 的 AT 模式和 TCC 模式,連接 Go 版 TC,能正確提交和回滾。
Go Client 調試
可能 Gopher 們比較關心 Seata Go Client。如文章一開始提到的,當前只支援TCC 模式。運行也比較簡單,直接運行 samples 文件夾中,tcc 文件夾下的 main.go,默認會去連接 127.0.0.1:8091。
訪問 //localhost:8080/commit, 模擬的 TCC 事務提交。
訪問 //localhost:8080/rollback, 模擬的 TCC 事務回滾。
可以連接 Go 版本的 TC Server,也可以連接 Java 版的 TC Server,都能正確提交回滾。
聲明:當前的 Seata Golang 版還比較粗糙簡陋,存在一些未知 bug,分享出來僅作技術交流與研究。Go 版本的 TC,全局事務、分支事務是直接存放在記憶體中的,還未持久化,預計五一假期結束支援持久化事務數據到 DB 中,屆時可以體驗原汁原味的 golang 版的分散式事務解決方案。最後,非常歡迎志同道合的朋友一起來共建。