0Pricing
C# Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 消息传递概念
  2. 生成和使用消息
  3. Saga 与工作流
  4. 错误处理与重试
← 返回 C# Academy