在.NET中輕鬆執行多步原子操作
在分散式的應用中,在微服務架構中,常常需要原子的執行多個操作,例如釋出文章後,需要更新相關的文章統計資訊
解決上述多步原子操作的經典模式是發件箱模式,該模式的實現比較複雜,一方面要依賴訊息佇列,另一方面還要管理定時輪詢任務,或者監聽資料庫的日誌,導致涉及多資料庫多租戶的這種場景下,尤其難以部署和維護。
本文介紹的方案,以更簡單易用的架構,實現了多步原子操作,並且可以非常方便的支援多資料庫多租戶的場景,如果併發不高,例如在開發測試環境,完全可以不依賴第三方中介軟體,非常容易上手部署使用。
該專案的github地址為:http://github.com/TeamStepping/Stepping.NET
Stepping
Stepping 是一個基於 BASE 的分散式作業實現。它可以作為工作流引擎,事件收/發件箱,用於郵箱/簡訊傳送,用於遠端介面呼叫等場景。
Stepping 中 Job
和 Step
是什麼?
Job
是一個分散式事務單元,而 Step
是 job 中一個特定的任務。
一個 job(作業)包含了一個或多個 step(步驟),事務管理器會按順序執行步驟。如果步驟 1 失敗了,它將重試直到成功,然後開始執行步驟 2。
什麼場景需要 Stepping
需要執行多個步驟且確保原子性
當一個 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 文件 http://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
。
瞭解更多資訊,請參閱 用法文件: http://github.com/TeamStepping/Stepping.NET/blob/main/docs/Usage.md
安裝
請參閱 安裝文件:http://github.com/TeamStepping/Stepping.NET/blob/main/docs/Installation.md
支援的事務管理器
Stepping 要求使用事務管理器。你可以選擇一種你喜歡的事務管理器。
Local-TM
Stepping 提供了一種簡單的內建事務管理器實現。Local-TM 與你的應用一起執行。在這種模式下,每個應用都作為自己釋出的 jobs 的事務管理器。
這種事務管理器適用於開發和測試環境,以及併發度較低的應用,不用額外維護元件
請參閱 Local-TM 文件: http://github.com/TeamStepping/Stepping.NET/blob/main/docs/LocalTm.md
DTM Server
DTM 是一個成熟的事務管理器,並且能夠為 Stepping 提供能力。選擇 DTM ,對於併發度高的應用,效能表現更好。你也可以使用DTM的SDK,支援更多的分散式事務模式,例如 Saga、TCC和XA。
請參閱 DTM 文件:http://dtm.pub
聯絡我們
歡迎訪問我們的專案,並star支援我們:
http://github.com/TeamStepping/Stepping.NET
http://github.com/dtm-labs/dtm
關注【分散式事務】公眾號,獲得更多分散式事務相關知識
- 再有人問你分散式事務,把這篇文章砸過去給他
- 基於Seata探尋分散式事務的實現方案
- 基於Seata探尋分散式事務的實現方案
- 在.NET中輕鬆執行多步原子操作
- 使用Stepping.NET輕鬆執行多步原子操作
- 八月最後一天,給小夥伴們彙報下 TienChin 專案視訊進度
- Replication(下):事務,一致性與共識
- 分散式事務解決方案之可靠訊息最終一致性
- 分散式事務解決方案之TCC
- 最終一致性性分散式事務 TCC
- 不就是個TCC分散式事務,有那麼難嗎?
- 強一致性分散式事務XA 淺析
- 分散式事務(Seata)原理 詳解篇,建議收藏
- 分散式事務(Seata)原理 詳解篇,建議收藏
- 微服務分散式事務處理
- go-zero微服務實戰系列(十、分散式事務如何實現)
- go-zero微服務實戰系列(十、分散式事務如何實現)
- 分散式事務seata 原理分析及原始碼解讀
- 使用強大的DBPack處理分散式事務(PHP使用教程)
- 一個月過去了,TienChin 專案視訊進度怎麼樣了呢?給大家彙報下!