本文將會對比Seata與EasyTransaction兩個分佈式事務的一些高層設計,相信你們會有收穫。git
Seata(曾用名Fescar,開源版本GTS)是阿里的開源分佈式事務框架,其RoadMap中指出了其但願與社區合做從新構建出一個全面的分佈式事務框架。github
關於Seata的相關介紹能夠看這裏,本文再也不贅述。雖然其後續路線有所調整,但總體適用。數據庫
https://github.com/seata/seata/wiki/%E6%A6%82%E8%A7%88
學習瞭解Seata後咱們能夠比對着瞭解EasyTransaction的架構設計。微信
EasyTransaction(後簡稱ET)的目標也是構建出一個全面分佈式事務解決方案,到目前爲止其包含TCC,自動補償(Seata AT),手動補償,可靠事務消息、Saga事務等等多種形態。網絡
下面將就兩個框架在設計上的差別進行分析架構
借用Seata的一張圖:
框架
與Seata不一樣,EasyTransaction對應的圖以下:
分佈式
Seata:性能
EasyTransaction:學習
Seata有集中式的TC,這樣其能夠 更容易 實現對分佈式事務的監管控,如關於APM、Metrics、統一限流 等等功能。
但在EasyTransaction中的TC形式能夠節約TC網絡交互時間,在上述Seata的業務圖中,ET的形式在兩階段提交中的第一階段能節約6次 網絡來回時間 及 正反序列化時間。
[(registerBranch以及reportBranch)* n個調用層級]
在兩階段提交的第二階段中,統一提交或者回滾過程當中,Seata的形式則是比EasyTransaction快,由於其不須要層級傳遞下去。視調用層級N的區別,ET形態的第二階段會比Seata慢 n-1 個網絡來回及正反序列化的的時間。
[ (commit或者rollback) * (n-1)個調用層級] (注:若考慮commit/rollback的次序的話,實際上 seata要按照 業務發生順序依次提交 或者 逆序回滾,其也爲串行,這也爲其默認作法,因此實際上ET在這個階段也會比Seata快一個 網絡來回及正反序列化的的時間)
至於 因爲數據分散性等等緣由APM、Metrics、統一限流 等等功能在ET形式如何實現 的這個問題,咱們能夠參考普通的RPC是怎麼作的,將其歸入統一的RPC管理便可,只是統一管控的力度沒有集中式的強大。
同時分散型的TC能 更容易 達到更高級別的可用性,其無需保證TC是否存活,業務服務在則TC在。分散的特徵也讓壓力能在正常業務狀況下,能均勻分散到不一樣的業務實例當中。
Seata:
EasyTransaction:
Seata單獨抽象了一套TM,其好處是自由可控,並能夠不依賴於任何框架。
ET其TM依賴於Spring的PTM的話,Spring這個框架就變成了使用ET的必選項。但相對的好處就是,全部做用於這個PTM的設施均可以做用於EasyTransaction。
例如Spring的RollbackFor,Transactional,Suspend註解,XML事務切面配置等等均可以直接爲EasyTransaction所用。由於ET僅僅只是擴展,所以這些功能都能兼容。甚至於咱們要引入JTA,EasyTransaction也能兼容,由於PTM自身就有JTA的實現。
Seata:
EasyTransaction
Seata全局事務裏的RM都是平等的存在,總體邏輯上有簡單統一的美,但所以其全部的RM都必須能接受兩階段的管控。
但在常規的業務模式中,全局事務開始者(Seata裏帶TM的那個)的事務,基本均可以在一階段內獲知全局事務應該回滾或者提交,但因爲Seata RM都平等的模式,發起方RM必要要用AT模式(記錄回滾數據),或者編寫TCC的提交回滾方法,這裏有一些額外的性能損耗
ET模式裏存在事務發起方RM的設定,其只要事務發起方的事務提交成功則全局事務(最終)提交,發起方事務提交失敗則全局事務(最終)回滾,所以其事務發起方無需兼容兩階段提交的協議,節約了相關的性能成本。固然,ET的事務發起方RM也能夠不寫入任何業務,這樣的話,就跟Seata的模式同樣了。
Seata:
EasyTransaction:
Seata經過TC保存全局記錄鎖引入了更多的複雜度,但其能自由控制鎖的實現,能針對場景實現出效率更高的鎖。
EasyTransction改造Seata的自動補償功能,將原有的遠程TC依賴改形成了EasyTransaction的分佈式TC,並將全局鎖實現改造到業務DB中。自動補償的總體實現複雜度下降了,但性能可能有所降低(未經測試)。
不過Seata相關的實現也在進行中
Seata
EasyTransaction
EasyTransaction沒有采用常規的作法,而是用本身的接口替代原RPC接口的一個緣由是這樣作能對整個事務過程能 更容易 地把控,其直接與業務交互,知道這一次調用的結果須要立刻返回仍是能夠稍後返回,知道這一次調用是重試仍是業務主動觸發的,能夠經過sdk主動設置RPC框架不進行重試,主動設置使其進行黏性會話以提升效率而不用用戶額外單獨配置
同時由於RPC是ET的一部分,所以冪等、cancel懸掛等等繁瑣重複的問題,能更容易地經過框架自動支持(已經實現),但若是Seata堅持目前輕量級作法的話,未來在實現相關功能時可能會更困難。
固然對業務暴露了ET的接口也算是一種耦合的加強。
Seata
EasyTransaction
ET利用Spring現有的配置接口進行配置,所以只要相關配置中心對接了Spring,EasyTransaction就能使用。但Seata爲了減小對Spring的依賴,所以相關對接須要單獨進行。
ET的TC整合到業務服務中,所以TC相關的服務發現只要利用業務自身的服務發現就能完成。而Seata的TC單獨部署,所以須要必定的適配工做。
跟上面的緣由相似,EasyTransaction的APM等操做只需借用已經整合到RPC框架的APM便可,而Seata須要必定的適配工做
Seata在短短几個月內能積累近萬Star除了阿里的技術號召力外,固然還有另一個緣由是分佈式事務領域如此廣泛且重要,但缺乏一個能讓小白都能放心無腦使用權威的實現,無疑Seata在如此熱烈的社區支持下頗有但願能成爲這麼一個實現。
但在Seata真正成爲這個權威實現前,我以爲你們也能夠抽空了解下EasyTransaction這個目前功能更爲強大、代碼更爲穩定、已上過生產的實現~
固然以上內容不少都帶我的主觀偏見,但願各位能補充各類見解,兼聽則明!
多年金融行業經驗,現爲某Top2互聯網(民營)銀行高級搬磚工,曾在兩家TOP3股份制商業銀行及一家互金創業公司工做(架構、核心業務主程),EasyTransaction做者,歡迎關注我的公衆號,在這裏我會分享平常工做、生活中對於架構、編碼和業務的思考。
公衆號
做者微信,添加微信請附上 暗號 ET