天天看點

分布式事務架構哪個好_.NET Core自帶分布式事務的微服務開源架構JMS

(給DotNet加星标,提升.Net技能)

轉自:IWing cnblogs.com/IWings/p/13327973.html

事務的統一性是微服務的一個重點問題,簡潔有效的控制事務,更是程式員所需要的。JMS的誕生,就是為了更簡單、更有效的控制事務。

先看一段調用微服務的代碼

using (var ms = new JMSClient())
{
//調用使用者資訊微服務,建立新使用者
var uis = ms.GetMicroService();var userid = uis.CreateUser();//調用銀行微服務,建立使用者的銀行賬号var bks = tran.GetMicroService();
    bks.CreateBankAccount( userid );//統一送出事務
    ms.Commit();
}
           

代碼中,分别調用了兩個不同的微服務,做了一些業務操作,最後,通過Commit方法,統一送出這兩個微服務的事務。

由于tran對象被using包裹,在這中間,任意一個代碼發生異常,整體事務都會被復原。

這樣的代碼風格,比較簡潔,也符合一貫的程式設計習慣。

我們再看一下微服務端的代碼

  • UserInfoService
public int CreateUser(TransactionDelegate tranDelegate)
{
var dbContext = new UserInfoDBContext();
//編寫新增使用者的業務代碼
    .........
//把資料庫的事務送出和復原,放到委托當中
    tranDelegate.CommitAction = () => dbContext.CommitTransaction();
    tranDelegate.RollbackAction = () => dbContext.RollbackTransaction();
return newUserId;
}
           
  • BankService
public int CreateBankAccount(TransactionDelegate tranDelegate,int userid){
var dbContext = new BankDBContext();
//...編寫建立銀行賬戶的業務代碼
//把資料庫的事務送出和復原,放到委托當中
    tranDelegate.CommitAction = () => dbContext.CommitTransaction();
    tranDelegate.RollbackAction = () => dbContext.RollbackTransaction();
return userBankId;
}
           

微服務寫完業務邏輯,最後,把事務的送出和復原放到委托當中,由架構自動調用。

JMS會在所有微服務執行完畢後,統一調用微服務挂起的委托,送出事務。

如果有任意一個微服務執行出錯、當機或者離線,其他微服務的操作會被復原,而離線的微服務,它所挂起的事務,也會在10秒之内復原。

而分布式事務,有一種情況是無法避免的,就是最終統一送出事務時,雖然确認了各個微伺服器響應正常,可以正常送出事務,這時候,所有伺服器響應号召,送出了事務,但是,最後發現,有一台伺服器當機了。

這種情況,是分布式系統無法避免的,但是,通過執行日志所提供的資料,可以把當機的服務,手動再執行一次。

事務實作原理

應用層

應用層調用微服務,微服務傳回調用結果,并告知應用層,微服務端是否有事務放在委托當中。

當應用層繼續調用其他微服務的時候,如果發生異常,那麼,通知所有微服務的委托復原事務;

如果沒有發生異常,全部微服務調用完畢,先确認一下所有調用的微伺服器是否還正常響應,任何一個伺服器響應不正常,也通知所有伺服器的遠端委托復原事務;

如果所有伺服器響應正常,那麼通知遠端委托送出事務;

送出事務過程中,如果某個伺服器出現網絡異常,繼續嘗試幾次與伺服器通訊,完成送出事務的通知工作;

微服務端

接到應用層指令,執行完函數,傳回結果給應用層,然後繼續和應用層保持長連接配接,保持心跳。

如果一切正常,最後,會響應應用層的指令,送出/復原事務;

如果連接配接意外斷開,把事務委托交到委托中心,而委托中心,在10秒内,如果收不到應用層的指令,那麼,自己復原委托的事務。

JMS特性

1、支援分布式事務控制;

2、支援分布式事務鎖;

3、網關支援雙機熱備;

4、支援配置檔案統一在網關部署、更新;

5、支援SSL雙向校驗;

6、可自定義定時任務;

7、負載均衡根據微服務的CPU使用率和目前請求數進行平均配置設定,也可自己編寫負載均衡規則;

8、支援小巧的雙重加密token(長度為68字元),實作使用者無狀态登入;

JMS支援的網絡架構方案

方案1:隻暴露應用伺服器

分布式事務架構哪個好_.NET Core自帶分布式事務的微服務開源架構JMS

這是應用伺服器和微服務溝通,效率最高的方案,也是我們使用最多的。如果我們的伺服器不是要部署在全國各地,那麼可以多台伺服器使用同一個區域網路,隻暴露應用伺服器作為唯一的通路入口。

方案2:暴露應用伺服器和代理伺服器

分布式事務架構哪個好_.NET Core自帶分布式事務的微服務開源架構JMS

伺服器需要分布在不同的地域,為了安全起見,可以通過一個代理伺服器,通路網關和微服務。

方案3:暴露所有伺服器

分布式事務架構哪個好_.NET Core自帶分布式事務的微服務開源架構JMS

伺服器需要分布在不同的地域,為了更高的效率和更低的成本,可以把所有伺服器暴露在網際網路上,與伺服器之間的通訊,經過SSL雙向加密機制保證安全。

以上3個方案便是JMS所支援的網絡架構,根據實際情況,自由配置适合自己的方案。

下一篇,JMS開發示例(一)

JMS的源碼庫位址:

https://github.com/simpleway2016/JMS

- EOF -

分布式事務架構哪個好_.NET Core自帶分布式事務的微服務開源架構JMS

推薦閱讀   點選标題可跳轉 ASP.NET Core在.NET 5 Preview 7的更新 微服務-服務之間的通信gRPC .NET 微服務實戰之負載均衡(上) 

看完本文有收獲?請轉發分享給更多人

關注「DotNet」加星标,提升.Net技能 

分布式事務架構哪個好_.NET Core自帶分布式事務的微服務開源架構JMS

好文章,我在看❤️