Apache ServiceComb Saga 是一個微服務應用的數據最終一致性解決方案
中文官方地址:https://github.com/apache/servicecomb-saga/blob/master/README_ZH.md
特性
- 高可用。支持集群模式。
- 高可靠。所有的事務事件都持久存儲在數據庫中。
- 高性能。事務事件是通過gRPC來上報的,且事務的請求信息是通過Kyro進行序列化和反序列化的。
- 低侵入。僅需2-3個注解和編寫對應的補償方法即可進行分布式事務。
- 部署簡單。可通過Docker快速部署。
- 支持前向恢復(重試)及后向恢復(補償)。
- 擴展簡單。基於Pack架構很容實現多種協調機制。
架構
Saga Pack 架構是由 alpha 和 omega組成,其中:
- alpha充當協調者的角色,主要負責對事務進行管理和協調。
- omega是微服務中內嵌的一個agent,負責對網絡請求進行攔截並向alpha上報事務事件。
alpha可以簡單理解是事務處理的服務端,
omega是需要進行事務處理的客戶端的SDK,在我的項目里,就是.net core應用程序的sdk,
幸運的是官方提供了C#語言版本Omega 可參見 https://github.com/OpenSagas-csharp/servicecomb-saga-csharp
數據庫官方目前提供了兩個:postpresql和mysql, 和alpha一樣都可以通過docker快速部署,
部署服務端alpha-server
下面開始部署服務端alpha-server:
官方提供了用於快速部署的docker compose文件:
version: '2' services: postgres: image: postgres container_name: postgres ports: - "5432:5432" environment: POSTGRES_USE: saga POSTGRES_USER: saga POSTGRES_PASSWORD: password networks: - saga alpha-server: image: djlnet/alpha-server:0.3.0-SNAPSHOT container_name: alpha-server ports: - "8080:8080" - "8090:8090" environment: JAVA_OPTS: -Dspring.profiles.active=prd -Dspring.datasource.url=jdbc:postgresql://postgres/saga?useSSL=false networks: - saga depends_on: - postgres networks: saga: driver: bridge
也就是說我們的環境首先要安裝docker 和 docker-compose
安裝成功后,我們運行docker-compose up -d命令
通過docker ps 可以看到容器已經啟動:
通過netstat -ntlp 可以看到端口已經開啟:
接下來,我們可以Navicat 12 for PostgreSQL 查看數據庫是否正常
下載安裝地址:https://www.navicat.com/en/download/navicat-premium
安裝成功后,創建連接,測試連接:
alpha-server運行成功的標志,目前還沒有一個UI,只能通過端口號是否運行,來判斷了。
服務端的工作就已經完成了。
部署客戶端
下面是客戶端:可以直接參考上面鏈接中的github項目,里面提供了三個測試項目:
主要的工作如下:
- 設置對alpha-server的連接,注冊自己
- 在事務開始的方法的打上attribute:SagaStart
- 添加事務補償方法
代碼非常簡單:
每個項目添加代碼:
在action方法上添加特性:SagaStart:
事務補償特性和補償方法:
部署完成后,就可以測試了,接口跑通后,就可以查看數據庫那三張表: