Saga 与工作流
协调长时间运行的流程。
Saga 与工作流 是 CoddyKit 上的免费 C# Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。
协调长时间运行的工作流
某些业务流程会随着时间跨越多条消息和多个步骤:下单、收取付款、预留库存、发货。长事务可以协调这种长时间运行的工作流,并在多条消息之间跟踪其状态。
什么是长事务
长事务是一种有状态的消费者。它会关联相关消息,保存工作流的当前状态,并通过在不同状态之间转换来响应事件,直到流程完成。
状态机长事务
MassTransit 使用 状态机,通过 MassTransitStateMachine 对长事务进行建模。您可以以声明方式定义状态、事件和转换。
dotnet add package MassTransit
// state machine sagas are built in长事务状态
状态是一个实现 SagaStateMachineInstance 的类。它包含一个 CorrelationId,以及您需要在各个步骤之间保存的其他数据。
public class OrderState : SagaStateMachineInstance
{
public Guid CorrelationId { get; set; }
public string CurrentState { get; set; }
public decimal Amount { get; set; }
}声明状态和事件
在状态机内部,您可以声明将消息类型映射到相应消息的 State 属性和 Event 属性。
public class OrderSaga : MassTransitStateMachine<OrderState>
{
public State AwaitingPayment { get; private set; }
public State Completed { get; private set; }
public Event<OrderPlaced> OrderPlaced { get; private set; }
public Event<PaymentReceived> PaymentReceived { get; private set; }
}关联
每个事件都必须关联到正确的长事务实例,通常使用共享标识符,例如 OrderId。这样,传入的消息就会被路由到正确的进行中工作流。
Event(() => PaymentReceived, e =>
e.CorrelateById(m => m.Message.OrderId));定义转换
构造函数连接各项行为:初始事件创建实例、保存数据,并转换到下一状态。
Initially(
When(OrderPlaced)
.Then(ctx => ctx.Saga.Amount = ctx.Message.Amount)
.TransitionTo(AwaitingPayment));在状态中响应
使用 During 处理仅在特定状态下有效的事件,然后发布后续消息并继续转换到下一个状态。
During(AwaitingPayment,
When(PaymentReceived)
.Publish(ctx => new OrderConfirmed(ctx.Saga.CorrelationId))
.TransitionTo(Completed)
.Finalize());持久化长事务状态
长事务状态必须在重启后继续保留,因此需要存储在存储库中,例如 Entity Framework、MongoDB、Redis 或其他存储系统。MassTransit 会在处理每条消息前后加载并保存实例。
x.AddSagaStateMachine<OrderSaga, OrderState>()
.EntityFrameworkRepository(r =>
{
r.ExistingDbContext<OrderDbContext>();
});使用调度设置超时
长事务可以使用 Schedule 设置超时,例如在 30 分钟内未收到付款时取消,然后处理超时事件以执行补偿。
补偿
如果后续步骤失败,长事务可以执行补偿操作来撤销之前的操作(退还费用、释放库存),在不使用分布式事务的情况下保持整个流程的一致性。
快速检查
测试长事务和工作流。
总结
长事务作为有状态且具有关联关系的消费者,协调长时间运行的工作流。MassTransit 使用 MassTransitStateMachine 和实现 SagaStateMachineInstance 的状态,声明 State/Event 成员,按标识符进行关联,并通过 Initially/During 执行转换。状态会持久化到存储库中,超时使用调度实现,失败时则通过补偿撤销之前的步骤。
常见问题解答
「Saga 与工作流」课时是免费的吗?
是的 — 「Saga 与工作流」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。
「Saga 与工作流」这节课中我会学到什么?
协调长时间运行的流程。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C# Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「Saga 与工作流」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C# Academy 课中编写并运行代码吗?
能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。