我应该如何 运行 compensations/rollback 使用 Axon Framework 进行 Saga Orchestration 的步骤?

How should I run compensations/rollback steps for a Saga Orchestration with Axon Framework?

对于我想使用 Axon 为几个服务实施 Saga Orchestration 的用例,我构建了:

然后我有一个用 @Saga 注释的 class 和 3 个 steps/event 处理程序:

我的问题是 我应该如何 rollback/compensate 所有之前执行的步骤 例如,如果送货服务失败?

从文档中我有一些疑问:

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

一个良好实施的 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
                  });
}