基於ServiceComb的分佈式事務框架Saga

[轉發]原文連接:https://www.jianshu.com/p/268dfc7e4a52git

概述

servicecomb-saga是一個微服務應用的數據最終一致性解決方案,是一種基於在2PC和TCC二者之間的框架,簡單的說是依賴協調器的TCC方式。github

特性

高可用。支持集羣模式。面試

高可靠。全部的事務事件都持久存儲在數據庫中。spring

高性能。事務事件是經過gRPC來上報的,且事務的請求信息是經過Kyro進行序列化和反序列化的。數據庫

低侵入。僅需2-3個註解和編寫對應的補償方法便可進行分佈式事務。apache

部署簡單。可經過Docker快速部署。服務器

支持前向恢復(重試)及後向恢復(補償)。網絡

saga架構圖

基於ServiceComb的分佈式事務框架Saga

alpha充當協調者的角色,主要負責對事務的事件進行持久化存儲以及協調子事務的狀態,使其得以最終與全局事務的狀態保持一致。架構

omega是微服務中內嵌的一個agent,負責對網絡請求進行攔截並向alpha上報事務事件,並在異常狀況下根據alpha下發的指令執行相應的補償操做。框架

Omega內部運行機制

omega是微服務中內嵌的一個agent。當服務收到請求時,omega會將其攔截並從中提取請求信息中的全局事務id做爲其自身的全局事務id(即Saga事件id),並提取本地事務id做爲其父事務id。在預處理階段,alpha會記錄事務開始的事件;在後處理階段,alpha會記錄事務結束的事件。所以,每一個成功的子事務都有一一對應的開始及結束事件。

基於ServiceComb的分佈式事務框架Saga

服務間通訊流程

服務間通訊的流程與Zipkin的相似。在服務生產方,omega會攔截請求中事務相關的id來提取事務的上下文。在服務消費方,omega會在請求中注入事務相關的id來傳遞事務的上下文。經過服務提供方和服務消費方的這種協做處理,子事務能鏈接起來造成一個完整的全局事務。

基於ServiceComb的分佈式事務框架Saga

具體處理流程

成功場景

成功場景下,每一個開始的事件都會有對應的結束事件。

基於ServiceComb的分佈式事務框架Saga

異常場景

異常場景下,omega會向alpha上報中斷事件,而後alpha會向該全局事務的其它已完成的子事務發送補償指令,確保最終全部的子事務要麼都成功,要麼都回滾。

基於ServiceComb的分佈式事務框架Saga

超時場景

超時場景下,已超時的事件會被alpha的按期掃描器檢測出來,與此同時,該超時事務對應的全局事務也會被中斷。

基於ServiceComb的分佈式事務框架Saga

QuickStart

引入Saga的依賴

<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}更改成實際的版本號。

添加Saga的註解及相應的補償方法

以一個轉帳應用爲例:

一、在應用入口添加 @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年。買了對於提高技術或者在服務器上搭建自由站點,都是很不錯的,若是本身有實際操做,面試+工做中確定是加分項。(老用戶能夠用家人或朋友的帳號購買,真心便宜&划算)

可「掃碼」或者「點擊購買 阿里雲"
基於ServiceComb的分佈式事務框架Saga

END

基於ServiceComb的分佈式事務框架Saga

相關文章
相關標籤/搜索