本文來談談我對若干分佈式事務框架的見解,只談設計時致使沒法輕易改變的硬傷(或者說個人偏見),其優勢應該已表如今其文檔中,再也不贅述。至於個人偏見能不能成爲你的偏見,請自行思考覈實,僅供你們選型時開拓思路使用。git
如下我略有了解的框架將成爲靶子:github
其是atomikos公司的兩階段提交事務的免費版本,說到兩階段提交你們第一印象應該都是慢,第二印象應該就是很方便,編碼少。數據庫
但實際上有多慢呢?可能你們都不太肯定,我這裏有一組數字供你們參考,相同業務場景,兩個服務有數據協同需求:編程
固然,這裏沒有給出具體的場景與配置,確實差值也有點大,我當時也是不太相信的。但我從多個不一樣測試數據源得到的數據都較爲相似,你們有空能夠協助驗證下,而後評論給下數據。安全
因此對於TransactionsEssentials這個框架,個人偏見就是,太慢。網絡
這是一個在GITHUB上開源了好久的框架了,其STAR數量接近3K,其代碼簡潔易懂。但其有三個缺點:併發
這會致使業務開發工做量大大增長。mvc
ByteTCC是一個兼容JTA規範的基於TCC機制的分佈式事務管理器。框架
其實我的以爲基JTA規範擴展的TCC實現並不是一個特別好的想法,其異步
不知道你們有沒有聽懂我上面說了什麼,其實就是說,若是讓我來設計,我是儘可能不會對原有邏輯進行修改,而是對邏輯進行擴展,這樣才能最大程度的程序的安全性,也能更好地與原有邏輯整合。
舉個例子,EasyTransaction裏就是基於擴展實現了各類功能,其能保證原有事務處理邏輯徹底不變,僅僅只是外掛了TCC、可靠消息等等的實現,同等狀況下,其實現的理論風險會更小,而且EasyTransaction能無縫兼容JTA事務以及EasyTransaction內的各類事務,並協調一塊兒工做,而ByteTCC則因爲其實現形式,難以簡單作到。
另一個方面是其代碼變得過於複雜,至少對我來講有理解難度,須要一些額外的知識支撐,不知道其餘人的見解是怎樣的。
同時關於冪等,ByteTCC只支持Confirm及Cancel操做的冪等,不過這比不少框架都要強了。
這個框架的主要描述是「高性能分佈式事務tcc方案開源框架」,我的感受其之因此這麼聲稱是由於「採用disruptor框架進行事務日誌的異步讀寫,與RPC框架的性能毫無差異」。
這裏有兩個我的認爲的硬傷(也許是偏見吧):
就一個簡單的問題吧,事務日誌存儲鏈接不上(網絡斷掉/掉電了),這時異步寫入的日誌放到內存了,而後遠程的訪問請求TRY發出去了,這個時候應用CRASH了。這就會致使TCC日誌不完整,從而致使事務沒法恢復。
有一些觀點認爲這些狀況極其少見,不需處理,那咱們併發編程時volatile之類的同步手段還須要用麼?
而且異常都是連鎖的,它並非孤立出現的,咱們沒法預判會出現什麼異常狀況,也有墨菲定律說,越擔憂的事情越有可能發生,所以咱們對於這類狀況必然是雖然咱們不能保證明現完美,可是咱們的理論至少要使完美的。
咱們知道,CPU的速度會比持久化IO的速度高不少個數量級,所以,基本上涉及持久化時,IO必然纔是主要優化的目標。
所以咱們作優化時,仿照KAFKA等,批量聚集數據,批量IO纔是正確的解決之道。不作這個而去優化CPU性能這有點本末倒置,同時據我瞭解的多個測試結果中,hmily的性能都大幅不及EasyTransaction。
同上Tcc-transaction
這個框架本質上是一個BestEffors 1PC的框架,是什麼意思呢,也就是大多數狀況下,只要應用不Crash就不會致使不一致。
這裏帶來什麼矛盾呢?除非你不關心不一致,容許數據出錯不修復,但一旦出現數據不一致必定要修復的狀況的話,就要走人工補償處理,或者調用相關的修復程序。
而人工補償處理,實際上,也就至關於人肉寫了一遍修復程序,並且人肉執行還沒留下代碼,下次出問題還要人工再分析處理一遍。
所以,結論很明顯:
tx-lcn這個框架是有適用場景的,可是我我的以爲最好把相關的厲害關係放到險要位置,否則有巨多小白無腦就用了,而不知道其中的坑,我以爲不太好。
這個框架的偏見嘛,主要就是髒讀了。貼一段以前寫過的文字。
GTS確實很贊,其核心原理是補償。
但這個補償作得很屌,補償操做由框架自動生成,無需業務干預,框架會記錄修改前的記錄值到上面的txc_undo_log裏,若須要回滾,則拿出undo_log的記錄覆蓋回原有記錄
同時這裏存在一個事務隔離級別的問題,GTS的作法是默認髒讀,那麼就能夠直接拿數據庫記錄展現(但我的以爲應該能夠不作髒讀,直接拿undo_log裏的記錄作mvcc,只要undo_log記錄不大,均可以加載到內存裏)。
還有另一個問題是如何禁止其餘事務對進行中的全局事務記錄的更新,GTS的作法是須要接管APP中的數據源,這樣就能夠解析控制業務要執行的SQL,對於update操做(或者select for update),予以禁止或等待。
不過總體的作法至關於魔改數據庫,將數據庫的部分功能拉到了業務APP裏進行,並修改了默認隔離級別(髒讀,若是業務有用數據庫記錄樂觀鎖來控制併發的話,將會失效),還有就是,不經過GTS的定製數據源訪問會訪問修改到未提交數據
這個嘛,是我本身寫的框架,上面出現的偏見,在我這裏都不會有,這篇文章本質是個軟文,哈哈,因此ET在我這沒有偏見,但我彙總下ET的優勢把:
以上的偏見是不成熟的小想法,如有不正確,各位大佬儘管在評論區拍磚。同時本文僅供各位大佬選型時開拓思路,我認爲的偏見不必定就是你的偏見,可能僅僅只是考慮角度、設計理念不同而已。
我的認爲EasyTransaction的理念、設計、可靠性、性能等都不會比上面的框架差,但ET的STAR數量卻不及上面的各個開源框架,我以爲必定是ET有什麼我本身沒有察覺到的缺陷,請你們拍磚以促進本框架進步,能夠直接評論,或者到GITHUB上提ISSUE,感謝你的改進建議!
https://github.com/QNJR-GROUP/EasyTransaction