天天看點

在.NET中輕松執行多步原子操作

在分布式的應用中,在微服務架構中,常常需要原子的執行多個操作,例如釋出文章後,需要更新相關的文章統計資訊

解決上述多步原子操作的經典模式是發件箱模式,該模式的實作比較複雜,一方面要依賴消息隊列,另一方面還要管理定時輪詢任務,或者監聽資料庫的日志,導緻涉及多資料庫多租戶的這種場景下,尤其難以部署和維護。

本文介紹的方案,以更簡單易用的架構,實作了多步原子操作,并且可以非常友善的支援多資料庫多租戶的場景,如果并發不高,例如在開發測試環境,完全可以不依賴第三方中間件,非常容易上手部署使用。

該項目的github位址為:​​https://github.com/TeamStepping/Stepping.NET​​

Stepping

Stepping 是一個基于 BASE 的分布式作業實作。它可以作為工作流引擎,事件收/發件箱,用于郵箱/短信發送,用于遠端接口調用等場景。

Stepping 中 ​

​Job​

​ 和  ​

​Step​

​ 是什麼?

​Job​

​ 是一個分布式事務單元,而  ​

​Step​

​ 是 job 中一個特定的任務。

一個 job(作業)包含了一個或多個 step(步驟),事務管理器會按順序執行步驟。如果步驟 1 失敗了,它将重試直到成功,然後開始執行步驟 2。

什麼場景需要 Stepping

在.NET中輕松執行多步原子操作

需要執行多個步驟且確定原子性

當一個 job 開始執行,Stepping 最終會完成你布置的所有 steps。如果你的應用在執行這些步驟期間挂了,事務管理器會在應用恢複後,繼續執行剩下的步驟。

Stepping 會按順序挨個完成你布置的 steps。如果一個步驟失敗,它會被推遲重試,這確定了 job 的 原子性。

當你的應用在執行步驟期間挂了,Stepping 有可能已經實際完成了這個步驟,而未自知,當你的應用恢複,Stepping 會備援地執行這個步驟。是以,你所有的步驟都應該做到 幂等。

需要確定在 DB 事務送出後,後續步驟一定執行

當一個綁定了 DB 事務的 job 開始執行,在 DB 事務送出後,Stepping 最終會完成你布置的所有 steps。

你無需擔心在 DB 事務送出後、後續步驟執行之前,這期間應用挂了導緻的非原子性問題。我們已經使用 DTM 的 二階段消息 模式處理了這種情況。

Stepping 也支援“多租戶且多資料庫”的場景,這意味着無論你的應用有多少個不同的資料庫,都不成問題。

用例

事務管理器會最終完成添加的步驟:

var job = await distributedJobFactory.CreateJobAsync();


job.AddStep(new RequestBank1TransferOutStep(args)); // 帶參數的步驟
job.AddStep<RequestBank2TransferInStep>(); // 不帶參數的步驟


await job.StartAsync();      

Steps 文檔 ​​https://github.com/TeamStepping/Stepping.NET/blob/main/docs/Steps.md​​ 介紹了如何定義一個步驟。

如果你希望在 DB 事務送出後開始執行一些步驟,并且確定它們最終能夠執行成功:

var db = serviceProvider.GetRequiredService<MyDbContext>(); // 以 EF Core 舉例
await db.Database.BeginTransactionAsync();


var order = new Order(args);


db.Orders.Add(order);
await db.SaveChangesAsync();


var job = await distributedJobFactory.CreateJobAsync(new EfCoreSteppingDbContext(db));


job.AddStep(new SendOrderCreatedEmailStep(order));
job.AddStep(new SendOrderCreatedSmsStep(order));


await job.StartAsync(); // 這個方法也會送出 DB 事務      

Stepping 支援 ​

​EF Core​

​ , ​

​ADO.NET​

​ (即将到來),及  ​

​MongoDB​

​ 。

了解更多資訊,請參閱 用法文檔: ​​https://github.com/TeamStepping/Stepping.NET/blob/main/docs/Usage.md​​

安裝

請參閱 安裝文檔:​​https://github.com/TeamStepping/Stepping.NET/blob/main/docs/Installation.md​​

支援的事務管理器

Stepping 要求使用事務管理器。你可以選擇一種你喜歡的事務管理器。

Local-TM

DTM Server