我应该如何 运行 compensations/rollback 使用 Axon Framework 进行 Saga Orchestration 的步骤?
How should I run compensations/rollback steps for a Saga Orchestration with Axon Framework?
对于我想使用 Axon 为几个服务实施 Saga Orchestration 的用例,我构建了:
- order-service(saga orchestrator with Spring boot + Axon Framework)
- 支付服务(微服务)
- 送货服务(微服务)
然后我有一个用 @Saga 注释的 class 和 3 个 steps/event 处理程序:
- 已创建订单(首次服务)
- 付款完成(第二次服务)
- 订单发货(第三次服务)
- 有效创建订单
我的问题是 我应该如何 rollback/compensate 所有之前执行的步骤 例如,如果送货服务失败?
从文档中我有一些疑问:
- 我需要用@Saga 创建一个新的 class 吗?
- 在失败的 服务上 我应该抛出异常还是将错误发送给另一个 Command/Event
- 我该怎么称呼
SagaLifecycle.end()
如果有一个显示一些代码的解决方案那就太好了。谢谢!
一个良好实施的 Saga 可以处理 Saga 正在管理的事务中发生的任何错误场景。因此,在从 saga 中发送 any 操作时,您应该能够预料到您会做出反应的异常情况。 这个反应就是你正在寻找的补偿作用。
现在,为您解答具体问题:
do I need to create a new class with @Saga?
非常有信心您不需要新的 saga 来解决您域中的异常情况。所以没有。
on the service that failed should I throw an Exception or send error to another Command/Event
我会在这里处理异常或事件,而不是命令(因为 (Axon) Saga 不处理命令)。您是否走任何一条路线取决于事件是否是有价值的业务事件,因此需要在事件中无限期存储。然而,使用事件将意味着您将 Saga 的容错行为拆分到不同的 Saga 事件处理程序之间,我个人不喜欢这样做。因此,我更喜欢从 saga 处理的其中一项服务中抛出异常。随后,如果您需要存储异常事件,只需在其旁边发布一个事件即可。
how should I call SagaLifecycle.end()
老实说,不确定您要问这个问题是什么。
一旦 Saga 的生命周期结束,就应该调用 SagaLifecycle.end()
。因此,当该交易完成时。 何时完成完全取决于您的域,并注意您需要发送补偿操作这一事实所必需的东西。
为了阐明我的意图,这里有一些(伪)代码显示了我将在何处执行补偿操作:
private transient CommandGateway commandGateway;
@SagaEventHandler(assocationProperty = "some-association)
public void on(SomeEvent event) {
// Validate/set state if necessary
commandGateway.send(new SomeCommand(...))
.exceptionally(exception -> {
// Dispatch compensating action through service/CommandGateway
});
}
对于我想使用 Axon 为几个服务实施 Saga Orchestration 的用例,我构建了:
- order-service(saga orchestrator with Spring boot + Axon Framework)
- 支付服务(微服务)
- 送货服务(微服务)
然后我有一个用 @Saga 注释的 class 和 3 个 steps/event 处理程序:
- 已创建订单(首次服务)
- 付款完成(第二次服务)
- 订单发货(第三次服务)
- 有效创建订单
我的问题是 我应该如何 rollback/compensate 所有之前执行的步骤 例如,如果送货服务失败?
从文档中我有一些疑问:
- 我需要用@Saga 创建一个新的 class 吗?
- 在失败的 服务上 我应该抛出异常还是将错误发送给另一个 Command/Event
- 我该怎么称呼
SagaLifecycle.end()
如果有一个显示一些代码的解决方案那就太好了。谢谢!
一个良好实施的 Saga 可以处理 Saga 正在管理的事务中发生的任何错误场景。因此,在从 saga 中发送 any 操作时,您应该能够预料到您会做出反应的异常情况。 这个反应就是你正在寻找的补偿作用。
现在,为您解答具体问题:
do I need to create a new class with @Saga?
非常有信心您不需要新的 saga 来解决您域中的异常情况。所以没有。
on the service that failed should I throw an Exception or send error to another Command/Event
我会在这里处理异常或事件,而不是命令(因为 (Axon) Saga 不处理命令)。您是否走任何一条路线取决于事件是否是有价值的业务事件,因此需要在事件中无限期存储。然而,使用事件将意味着您将 Saga 的容错行为拆分到不同的 Saga 事件处理程序之间,我个人不喜欢这样做。因此,我更喜欢从 saga 处理的其中一项服务中抛出异常。随后,如果您需要存储异常事件,只需在其旁边发布一个事件即可。
how should I call SagaLifecycle.end()
老实说,不确定您要问这个问题是什么。
一旦 Saga 的生命周期结束,就应该调用 SagaLifecycle.end()
。因此,当该交易完成时。 何时完成完全取决于您的域,并注意您需要发送补偿操作这一事实所必需的东西。
为了阐明我的意图,这里有一些(伪)代码显示了我将在何处执行补偿操作:
private transient CommandGateway commandGateway;
@SagaEventHandler(assocationProperty = "some-association)
public void on(SomeEvent event) {
// Validate/set state if necessary
commandGateway.send(new SomeCommand(...))
.exceptionally(exception -> {
// Dispatch compensating action through service/CommandGateway
});
}