[轉發]原文連接:https://www.jianshu.com/p/268dfc7e4a52git
servicecomb-saga是一個微服務應用的數據最終一致性解決方案,是一種基於在2PC和TCC二者之間的框架,簡單的說是依賴協調器的TCC方式。github
高可用。支持集羣模式。面試
高可靠。全部的事務事件都持久存儲在數據庫中。spring
高性能。事務事件是經過gRPC來上報的,且事務的請求信息是經過Kyro進行序列化和反序列化的。數據庫
低侵入。僅需2-3個註解和編寫對應的補償方法便可進行分佈式事務。apache
部署簡單。可經過Docker快速部署。服務器
支持前向恢復(重試)及後向恢復(補償)。網絡
alpha充當協調者的角色,主要負責對事務的事件進行持久化存儲以及協調子事務的狀態,使其得以最終與全局事務的狀態保持一致。架構
omega是微服務中內嵌的一個agent,負責對網絡請求進行攔截並向alpha上報事務事件,並在異常狀況下根據alpha下發的指令執行相應的補償操做。框架
omega是微服務中內嵌的一個agent。當服務收到請求時,omega會將其攔截並從中提取請求信息中的全局事務id做爲其自身的全局事務id(即Saga事件id),並提取本地事務id做爲其父事務id。在預處理階段,alpha會記錄事務開始的事件;在後處理階段,alpha會記錄事務結束的事件。所以,每一個成功的子事務都有一一對應的開始及結束事件。
服務間通訊的流程與Zipkin的相似。在服務生產方,omega會攔截請求中事務相關的id來提取事務的上下文。在服務消費方,omega會在請求中注入事務相關的id來傳遞事務的上下文。經過服務提供方和服務消費方的這種協做處理,子事務能鏈接起來造成一個完整的全局事務。
成功場景下,每一個開始的事件都會有對應的結束事件。
異常場景下,omega會向alpha上報中斷事件,而後alpha會向該全局事務的其它已完成的子事務發送補償指令,確保最終全部的子事務要麼都成功,要麼都回滾。
超時場景下,已超時的事件會被alpha的按期掃描器檢測出來,與此同時,該超時事務對應的全局事務也會被中斷。
<dependency> <groupId>org.apache.servicecomb.saga</groupId> <artifactId>omega-spring-starter</artifactId> <version>${saga.version}</version> </dependency> <dependency> <groupId>org.apache.servicecomb.saga</groupId> <artifactId>omega-transport-resttemplate</artifactId> <version>${saga.version}</version> </dependency>
注意: 請將${saga.version}更改成實際的版本號。
以一個轉帳應用爲例:
一、在應用入口添加 @EnableOmega 的註解來初始化omega的配置並與alpha創建鏈接。
@SpringBootApplication @EnableOmega public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
二、在全局事務的起點添加 @SagaStart 的註解。
@SagaStart(timeout=10) public boolean transferMoney(String from, String to, int amount) { transferOut(from, amount); transferIn(to, amount); }
注意: 默認狀況下,超時設置須要顯式聲明才生效。
三、在子事務處添加 @Compensable 的註解並指明其對應的補償方法。
@Compensable(timeout=5, compensationMethod="cancel") public boolean transferOut(String from, int amount) { repo.reduceBalanceByUsername(from, amount); } public boolean cancel(String from, int amount) { repo.addBalanceByUsername(from, amount); }
注意: 實現的服務和補償必須知足冪等的條件。
注意: 默認狀況下,超時設置須要顯式聲明才生效。
注意: 若全局事務起點與子事務起點重合,需同時聲明 @SagaStart 和 @Compensable 的註解。
四、對轉入服務重複第三步便可。
參考:https://github.com/apache/incubator-servicecomb-saga/
[轉發]原文連接:https://www.jianshu.com/p/268dfc7e4a52
超值推薦:
阿里雲雙12已開啓,雲產品冰點價,新用戶專享1折起,1核2G雲服務器僅需89元/年,229元/3年。買了對於提高技術或者在服務器上搭建自由站點,都是很不錯的,若是本身有實際操做,面試+工做中確定是加分項。(老用戶能夠用家人或朋友的帳號購買,真心便宜&划算)
可「掃碼」或者「點擊購買 阿里雲"