Stepping 是一個基于 BASE 的分布式作業實現。它可以作為工作流引擎,事件收/發件箱,用于郵箱/短信發送,用于遠程接口調用等場景。
Stepping 中?Job
?和?Step
?是什么?
Job
?是一個分布式事務單元,而?Step
?是 job 中一個特定的任務。
一個 job(作業)包含了一個或多個 step(步驟),事務管理器會按順序執行步驟。如果步驟 1 失敗了,它將重試直到成功,然后開始執行步驟 2。
什么場景需要 Stepping
需要執行多個步驟且確保原子性
當一個 job 開始執行,Stepping 最終會完成你布置的所有 steps。如果你的應用在執行這些步驟期間掛了,事務管理器會在應用恢復后,繼續執行剩下的步驟。
Stepping 會按順序挨個完成你布置的 steps。如果一個步驟失敗,它會被推遲重試,這確保了 job 的?原子性。請確保你所有的 step 都能在重試后最終成功,除非它是一個 Saga step。
當你的應用在執行步驟期間掛了,Stepping 有可能已經實際完成了這個步驟,而未自知,當你的應用恢復,Stepping 會冗余地執行這個步驟。因此,你所有的步驟都應該做到?冪等。
需要確保在 DB 事務提交后,后續步驟一定執行
當一個綁定了 DB 事務的 job 開始執行,在 DB 事務提交后,Stepping 最終會完成你布置的所有 steps。
你無需擔心在 DB 事務提交后、后續步驟執行之前,這期間應用掛了導致的非原子性問題。我們已經使用 DTM 的?二階段消息:https://en.dtm.pub/practice/msg.html ?模式處理了這種情況。
Stepping 也支持“多租戶且多數據庫”的場景,這意味著無論你的應用有多少個不同的數據庫,都不成問題。
用例
事務管理器會最終完成添加的步驟:
var job = await distributedJobFactory.CreateJobAsync();job.AddStep(new RequestBank1TransferOutStep(args)); // 帶參數的步驟
job.AddStep<RequestBank2TransferInStep>(); // 不帶參數的步驟await job.StartAsync();
Steps 文檔?介紹了如何定義一個步驟。
如果你希望在 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 要求使用事務管理器。你可以選擇一種你喜歡的事務管理器。
DTM Server
DTM 是一個成熟的事務管理器,并且能夠為 Stepping 提供能力。選擇 DTM 你將可以使用更多的分布式事務模式,例如 Saga、TCC和XA。
請參閱 DTM 文檔:https://github.com/TeamStepping/Stepping.NET/blob/main/docs/Dtm.md。
Local-TM
Stepping 提供了一種簡單的內置事務管理器實現。Local-TM 與你的應用一起運行。在這種模式下,每個應用都作為自己發布的 jobs 的事務管理器。
請參閱 Local-TM 文檔:https://github.com/TeamStepping/Stepping.NET/blob/main/docs/LocalTm.md。