Spring boot 我应该如何使用Axon框架为Saga编排运行补偿/回滚步骤?

Spring boot 我应该如何使用Axon框架为Saga编排运行补偿/回滚步骤?,spring-boot,microservices,axon,saga,Spring Boot,Microservices,Axon,Saga,对于我想为Axon的几项服务实现Saga编排的用例,我构建了: 订单服务(带有Spring boot+Axon框架的saga orchestrator) 支付服务(微服务) 航运服务(微服务) 然后我有一个用@Saga注释的类,有3个步骤/事件处理程序: 已创建订单(第一次服务) 付款完成(第二次服务) 已发货订单(第三次服务) 有效创建的订单 我的问题是如果(例如)配送服务失败,我应该如何回滚/补偿所有以前执行的步骤? 从文档中,我对以下方面有一些疑问: 我需要用@Saga创建一个新

对于我想为Axon的几项服务实现Saga编排的用例,我构建了:

  • 订单服务(带有Spring boot+Axon框架的saga orchestrator
  • 支付服务(微服务)
  • 航运服务(微服务)
然后我有一个用@Saga注释的类,有3个步骤/事件处理程序:

  • 已创建订单(第一次服务)
  • 付款完成(第二次服务)
  • 已发货订单(第三次服务)
  • 有效创建的订单
我的问题是如果(例如)配送服务失败,我应该如何回滚/补偿所有以前执行的步骤?

从文档中,我对以下方面有一些疑问:

  • 我需要用@Saga创建一个新类吗
  • 在失败的服务上,我是否应该引发异常或向其他命令/事件发送错误
  • 我应该如何调用
    SagaLifecycle.end()

如果有一个显示一些代码的解决方案,那就太好了。谢谢

一个实施良好的传奇可以处理所述传奇管理的事务中出现的任何错误场景。因此,在从传奇中派遣任何行动时,您应该能够预料到一个例外情况,您将对此作出反应。正是这种反应才是你想要的补偿作用

现在,让我们来回顾一下您的确切问题:

我需要用@Saga创建一个新类吗

非常有信心,您不需要新的传奇故事来解决您所在领域的异常情况。所以没有

在失败的服务上,我是否应该引发异常或向其他命令/事件发送错误

我会在这里使用异常或事件,而不是命令(因为(Axon)Saga不处理命令)。您是否走这两条路线取决于事件是否是有价值的业务事件,因此需要无限期地存储在事件中。然而,使用事件将意味着在不同的Saga事件处理程序之间分割Saga的容错行为,我个人不喜欢这样。因此,我倾向于从saga要处理的服务中抛出一个异常。随后,如果需要存储异常事件,只需在其旁边发布一个事件即可

我应该如何调用SagaLifecycle.end()

老实说,我不知道你想问这个问题。 一旦Saga的生命周期结束,就应该调用
SagaLifecycle.end()
。因此,当该事务完成时。何时完成完全取决于您的域,并注意到您需要发送补偿操作这一事实所必需的一些内容

为了澄清我的意图,这里有一些(伪)代码显示了我将在哪里执行补偿操作:

private transient CommandGateway CommandGateway;
@SagaEventHandler(AssociationProperty=“某些关联)
(某些事件)上的公共无效{
//如有必要,验证/设置状态
commandGateway.send(新建SomeCommand(…)
.例外情况(例外情况->{
//通过服务/命令网关调度补偿操作
});
}

如果有一个显示一些代码的解决方案,那就太好了。谢谢!-如果有一个显示一些代码的问题,那就太好了…:)看起来异常()完成工作。关于结束SagaLifecycle,是因为我不确定如何在一个或多个saga类中使用补偿。谢谢你能详细说明为什么
异常()
不起作用吗?目前我还不清楚。确切地说,我在谈论这个方法: