雖然微服務現在如火如荼,但對其實踐其實仍處於初級階段。即使互聯網巨頭的實踐也大多是試驗層面,鮮有核心業務系統微服務化的案例。GTS是目前業界第一款,也是唯一的一款通用的解決微服務分布式事務問題的中間件,而且可以保證數據的強一致性。本文將對GTS做出深入解讀。
微服務倡導將復雜的單體應用拆分為若干個功能簡單的、松耦合的服務,這樣可以降低開發難度、增強擴展性、便於敏捷開發。概念2012年提出迅速火遍全球,被越來越多的開發者推崇,很多互聯網行業巨頭、開源社區等都開始了微服務的討論和實踐。根據Netflix雲架構總監Adrian Cockcrof,Hailo有160個不同服務構成,NetFlix有大約600個服務。國內方面,阿里巴巴、騰訊、360、京東、58等很多互聯網公司都進行了微服務化改造。當前微服務的開發框架也有幾十種之多,比較著名的有Dubbo、SpringCloud、thrift 、grpc等。
GTS是一款分布式事務中間件,由阿里巴巴中間件部門研發,可以為微服務架構中的分布式事務提供一站式解決方案。GTS方案的基本思路是:將分布式事務與具體業務分離,在平台層面開發通用的事務中間件GTS,由事務中間件協調各服務的調用一致性,負責分布式事務的生命周期管理、服務調用失敗的自動回滾。
GTS方案有三方面的優勢,首先它將微服務從分布式事務中解放出來,微服務的實現不需要再考慮反向接口、冪等、回滾策略等復雜問題,只需要業務自己的接口即可,大大降低了微服務開發的難度與工作量。將分布式事務從所謂的“貴族技術”變為大家都能使用的“平民技術 ”,有利於微服務的落地與推廣。 其次,GTS對業務代碼幾乎沒有侵入,只需要通過注解@TxcTransaction界定事務邊界即可,微服務接入GTS的成本非常低。第三,性能方面GTS也非常優秀,是傳統XA方案的8~10倍。
1.1 基本原理
GTS中間件主要包括客戶端(GTS Client)、資源管理器(GTS RM)和事務協調器(GTS Server)三部分。GTS Client主要完成事務的發起與結束。GTS RM完成分支事務的開啟、提交、回滾等操作。GTS Server主要負責分布式事務的整體推進,事務生命周期的管理。
GTS和微服務集成后的結構圖如上圖所示。GTS Client需要和業務應用集成部署,RM與微服務集成部署。當業務應用發起服務調用時,首先會通過GTS Client向TC注冊新的全局事務。之后GTS Server會給業務應用返回全局唯一的事務編號xid。業務應用調用服務時會將xid傳播到服務端。微服務在執行數據庫操作時會通過GTS RM向GTS Server注冊分支事務,並完成分支事務的提交。如果A、B、C三個服務均調用成功,GTS Client會通知GTS Server結束事務。假設C調用失敗,GTS Client會要求GTS Server發起全局回滾。然后由各自的RM完成回滾工作。
1.2 GTS的關鍵機制
- 可用性
GTS服務也是由多個節點構成的高可用集群,可以彈性擴張,可以接收高並發的客戶端請求。可以支持跨機房部署,支持同城容災和兩地三中心容災。任何異常情況下的保證高可用。 - 自動回滾策略
當有微服務調用失敗時,GTS服務可以驅動各微服務的RM替微服務完成調用的回滾工作。舉個轉賬的例子,轉賬應用通常調用存款服務和扣款服務完成轉賬功能。先調用扣款服務從A賬戶扣掉100元,然后調用存款服務向B賬戶中存款100元。如果轉賬應用在調用存款服務失敗時,GTS Client會要求GTS Server發起回滾,然后通知扣款服務對應的RM,RM會直接在A賬戶增加100元。然后GTS Server通知轉賬應用回滾成功。從這個過程可以看到,在調用服務失敗后,其實微服務不用做任何工作,而是由RM替微服務執行反向操作,也很自然的避免了冪等操作。TCC方案中,事務協調器需要顯示調用微服務的反向向接口,如果反向接口調用失敗還需要不斷重試。 - 可擴展性
有些情況下,應用需要調用第三方系統的接口或者不是基於GTS開發的微服,GTS無法接入到這些服務的實現中。此時需要用到GTS的MT模式。GTS的MT模式可以等價於TCC模式。
MT模式預留了一階段和二階段的提交接口,允許應用介入GTS的兩階段提交。應用將提交及回滾接口注冊后,GTS會自動完成調用。
- 隔離級別
GTS目前支持讀未提交和讀已提交兩種隔離級別。
1.3 GTS與其他方案的對比
1. 和XA方案對比
相比XA方案,GTS更加通用,可以對上層業務屏蔽底層實現細節,對業務幾乎沒有侵入。這一點在微服務時代特別有用,微服務面對的是大量的中小企業,甚至是個人開發者,業務訴求不盡相同,普適、標准的分布式事務產品是非常有必要的,可以讓開發者從底層技術細節中脫離出來,更專注於業務邏輯的實現,從而獲得更高效、快速的業務發展。兩個方案都可以遵循ACID特性,都可以實現事務的強一致性。GTS性能要比XA方案高。
2. 和TCC方案對比
GTS方案和TCC方案最大的區別是實現分布式事務實現的層面不同。TCC方案選擇從業務層面實現分布式事務功能,將事務的回滾、重試等功能在微服務中實現。而GTS選擇從中間件層面解決分布式事務問題,對微服務幾乎無侵入。兩個方案都可以獲得比較好的性能,都可以保證調用的一致性。TCC方案實現難度比較大,適合技術實力較強的團隊。GTS方案可以實現事務的強一致性,另外采用GTS方案后微服務會更簡單,耦合性也非常低。TCC主要提供開發框架,實現需要依賴業務方,而GTS是完整的分布式事務解決方案,所有分布式事務問題不需要業務方介入。
3. 和消息最終一致性對比
相比消息方案,GTS方案侵入性非常低,可以實現數據的強一致性。采用消息方案,上下游服務之間有很強的耦合性,測試、部署都不是很方便,需要單獨建設消息系統。不過消息方案實現相對簡單,如果對一致性要求不高,也是一個選擇。
1.4 GTS的應用場景
GTS可應用在涉及服務調用的多個領域,包括但不限於金融支付、電信、電子商務、快遞物流、廣告營銷、社交、即時通信、手游、視頻、物聯網、車聯網等,詳細介紹可以閱讀 《GTS--阿里巴巴分布式事務全新解決方案》一文。
1.5 GTS的輸出形式
GTS目前有三種輸出形式:通過公有雲平台輸出、通過公網雲服務輸出、通過專有雲平台輸出。
- 1 通過公有雲平台輸出
這種輸出形式主要面向阿里雲用戶。如果用戶的業務系統已經部署到阿里雲上,可以直接申請開通公有雲GTS。開通后業務應用即可通過GTS保證服務調用的一致行。這種使用場景下,業務系統和GTS間的網絡環境比較理想,GTS能提供更低的響應時間。
公有雲提供了比較豐富的與dubbo、SpringCloud等集成的樣例,可以點擊查看。
- 2 通過公網雲服務輸出
這種輸出形式主要面向於非阿里雲的用戶,使用更加方便、靈活,業務系統只要能連接互聯網即可享受GTS提供的雲服務。在網絡抖動和閃斷的情況下,GTS仍能保證服務調用的一致性。在正常網絡環境下,以包含兩個本地事務的全局事務為例,事務完成時間在20ms左右,業務可以輕松實現1000TPS以上分布式事務,可以滿足絕大多數業務系統的需要。也可以用於本地的開發和測試 。
現在提供了sample-txc-simple和sample-txc-sample兩個樣例,sample-txc-simple是GTS的入門的基礎樣例,點擊下載后,搭建好本地的數據庫環境就可以直接運行樣例。sample-txc-dubbo是GTS和dubbo框架集成的樣例,也可以直接在本地機器運行。
- 3 通過專有雲平台輸出
這種形式主要面向於已建設了自己專有雲平台的大用戶,GTS可以直接部署到用戶的專有雲平台上,為專有雲提供分布式事務服務。目前國家電網公司、中國郵政、浙江煙草等特大型企業的專有雲都使用GTS,保證數據一致性。
1.6 GTS的使用方式
GTS對應用的侵入性非常低,使用也非常簡單。下面以訂單存儲應用為例說明。訂單業務應用通過調用訂單服務和庫存服務完成訂單業務,服務開發框架為dubbo。
1 訂單業務應用
在業務函數外圍使用@TxcTransaction注解即可開啟分布式事務。dubbo應用通過隱藏參數將GTS的事務xid傳播到服務端。
@TxcTransaction(timeout = 1000 * 10)
public void Bussiness(OrderServiceInterface os,StockServiceInterface ss)
{
//獲取xid
String xid = TxcContext.getCurrentXid();
//1:調用訂單服務,創建訂單
//通過dubbo的隱形參數將txcid傳到服務端
RpcContext.getContext().setAttachment("xid",xid);
int ret = os.setOrder(new Order(pid,num,new Date()));//調用訂單服務
//2:調用庫存服務,扣庫存
RpcContext.getContext().setAttachment("xid",xid);
}
2 服務端使用方式
庫存服務
public int setStock(Stock sk) {
//通過dubbo上下文獲取xid
String xid = RpcContext.getContext().getAttachment("xid");
//將事務id綁定到服務端txc的上下文
TxcContext.bind(xid,null);
//執行扣庫存操作
ret = jdbcTemplate2.update("update stock set number = number -? where pid = ?",new Object[]{sk.getPnum(),sk.getPid()});
return ret;
}
1.7 GTS的應用情況
GTS在滿足事務ACID的前提下,普通配置的單服務器可以達到15000 TPS以上的超強性能(兩個小時完成1億多筆業務)。目前已經在淘寶、天貓、阿里影業、淘票票、阿里媽媽、1688等阿里各業務系統廣泛使用,經受了16年和17年兩年雙十一海量請求的考驗。某線上業務系統最高流量已達十萬TPS(每秒鍾10萬筆事務)。GTS在阿里雲及專有雲上輸出后,有很多用戶通過GTS解決SpringCloud、Dubbo、Edas等微服務的分布式事務問題,包括國家電網、中國郵政、中國煙草、特步、浙江公安、德邦快遞、一步共享科技等,涉及電力、物流、ETC、煙草、金融、零售、電商、共享出行等十幾個行業,得到用戶的一致認可。
上圖是GTS與SpringCloud集成,應用於某共享出行系統。業務共享出行場景下,通過GTS支撐物聯網系統、訂單系統、支付系統、運維系統、分析系統等系各統應用事務一致性,保證海量訂單和數千萬流水的交易。