華為云微服務引擎CSE事務方案一:TCC機制的數據最終一致性處理
限時免費領取華為云微服務
TCC機制的數據最終一致性處理
在一個長事務中,一個由兩臺服務器一起參與的事務,服務器A發起事務,服務器B參與事務,B的事務需要人工參與,所以處理時間可能很長。如果按照ACID的原則,要保持事務的隔離性、一致性,A發起的事務中使用到的事務資源將會被鎖定,不允許其他應用訪問到事務過程中的中間結果,直到整個事務被提交或者回滾。這就造成事務A中的資源被長時間鎖定,系統將不可用。
為了解決在事務運行過程中大顆粒度資源鎖定的問題,業界提出一種新的事務模型,它是基于業務層面的事務定義。鎖粒度完全由業務自己控制。它本質是一種補償的思想。它把事務運行過程分成Try、Confirm/Cancel兩個階段。在每個階段的邏輯由業務代碼控制。這樣就事務的鎖粒度可以完全自由控制。業務可以在犧牲強隔離性的情況下,獲取更高的性能。
Try:嘗試執行業務
完成所有業務檢查(一致性)
預留必須業務資源(準隔離性)
Confirm:確認執行業務
真正執行業務
不作任何業務檢查
只是用Try階段預留的業務資源
Confirm操作滿足冪等性
Cancel:取消執行業務
釋放Try階段預留的業務資源
Cancel操作滿足冪等性
與2PC協議比較
位于業務服務層而非資源層
沒有單獨的準備(Prepare)階段,Try操作兼備資源操作與準備能力
Try操作可以靈活選擇業務資源的鎖定粒度
較高開發成本
POM中引入TCC事務對應的依賴包:
在microservice.yaml中添加進處理鏈:
cse: ??...... ??handler: ????chain: ??????Provider: ????????default:?perf-stats,tcc-server ??......
定義服務實現類
@RpcSchema(schemaId?=?"helloworld") public?class?TccHelloworldImpl?implements?ITccHelloworld?{ ????private?static?final?Logger?LOGGER?=?LoggerFactory.getLogger(TccHelloServiceImpl.class); ????@Override ????@TccTransaction(confirmMethod?=?"confirm",?cancelMethod?=?"cancel") ????public?String?sayHello(String?name)?{ ????????LOGGER.info("Try?say?hello?from?client,?{}",?name); ????????return?"Hello,?"?+?name; ????} ????public?String?confirm(String?name)?{ ????????LOGGER.info("Confirm?say?hello?from?client,?{}",?name); ????????return?null; ????} ????public?String?cancel(String?name)?{ ????????LOGGER.info("Cancel?say?hello?from?client,?{}",?name); ????????return?null; ????} }
在支持TCC事務的方法上打上@TccTransaction標注,并注明confirmMethod和cancelMethod方法。confirmMethod和cancelMethod的參數和返回值必須和服務提供函數相同。如果Try正常執行,confirm方法也會被執行。如果Try拋出異常,則cancel會被執行。
注意:
如果不使用標注的方式發布服務,那么需要在實現類上面打上@Component標注。
TCC事務對業務邏輯定義需要有一定要求,TCC操作應該支持冪等性原則,否則容
易產生過度補償等問題。
TCC支持運行在微服務多實例中,其原理是將事務數據統一存儲到數據庫中,TCC組件提供統一的事務存儲接口,以便開發對接不同的數據庫,只需要繼承實現com.huawei.paas.cse.tcc.repository.CachableTransactionRepository類即可完成多實例TCC支持;也可參考com.huawei.paas.cse.tcc.repository包中簡單的數據庫存儲類實現,已簡單實現了Jdbc/redis/ZooKeeper的對接。
yaml文件中bizkeeper和tcc-server配置先后順序會引起前臺儀表盤不同的計數方式。若將tcc-server配置在bizkeeper前,儀表盤中顯示server端一次調用,反之儀表盤顯示兩次調用,因為bizkeeper的計數在tcc-sever的打點前則會有2次restful接口調用。
TCC配置在microservice.yaml文件中,相關配置項如下。
配置項
默認值
取值范圍
是否必選
含義
cse.tcc.transaction.repository
com.huawei.paas.cse.tcc.repository.FileSystemTransactionRepository
true/false
是
事務存儲倉庫
cse.tcc.transaction.repository.file.path
tcc
-
是
使用文件系統存儲事務時,指定文件存儲根路徑,默認在當前目錄的tcc文件夾下
cse.tcc.transaction.recover
true
true/false
是
是否啟動恢復機制
立即體驗華為微服務CSE:https://console.huaweicloud.com/cse/?region=cn-north-1#/cse/home
了解詳情:https://www.huaweicloud.com/product/cse.html
微服務 ServiceComb 微服務引擎 CSE
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。