在分布式的應用中,在微服務架構中,常常需要原子的執行多個操作,例如釋出文章後,需要更新相關的文章統計資訊
解決上述多步原子操作的經典模式是發件箱模式,該模式的實作比較複雜,一方面要依賴消息隊列,另一方面還要管理定時輪詢任務,或者監聽資料庫的日志,導緻涉及多資料庫多租戶的這種場景下,尤其難以部署和維護。
本文介紹的方案,以更簡單易用的架構,實作了多步原子操作,并且可以非常友善的支援多資料庫多租戶的場景,如果并發不高,例如在開發測試環境,完全可以不依賴第三方中間件,非常容易上手部署使用。
該項目的github位址為:https://github.com/TeamStepping/Stepping.NET
Stepping
Stepping 是一個基于 BASE 的分布式作業實作。它可以作為工作流引擎,事件收/發件箱,用于郵箱/短信發送,用于遠端接口調用等場景。
Stepping 中 Job
和 Step
是什麼?
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 文檔 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 要求使用事務管理器。你可以選擇一種你喜歡的事務管理器。