首页 > 解决方案 > Axon Framework:具有两个或三个微服务之间补偿事件的 Saga 项目

问题描述

我有一个关于 Axon Saga 的问题。我有一个项目,我有三个微服务,每个微服务都有自己的数据库,但是两个“从”微服务必须将他的数据共享给“主”微服务,因为我想使用 Axon Saga。我已经问了一个关于赔偿的问题,当出现问题时,我必须自己处理赔偿,可以,但并不理想。目前我正在使用 DistributedCommandBus 在微服务之间进行通信,这样做有好处吗?我正在使用 Choreography Saga 模型,所以它现在看起来像这样:

  1. Master -> Send command -> Slave1 -> Handles event
  2. 从站1 -> 发回命令 -> 主站 -> 处理事件
  3. Master -> 发送命令 -> Slave2 -> 处理事件
  4. 从站 2 -> 发回命令 -> 主站 -> 处理事件

如果出现问题,则补偿命令/事件会倒退。

我的问题是,有没有人对 Axon 做过这样的事情,有补偿,最好的做法是什么?如何重试 Saga 进程?使用 RetryScheduler?如果可以的话,添加一个 github 仓库。

谢了哥们

标签: javaspring-bootsagaaxon

解决方案


首先,让我回答你的主要问题:

我的问题是有人用 Axon 做过这样的事情吗?

很快,是的,因为这是 Sagas 的主要用例之一。根据经验,我想说 Saga 可用于协调以下之间的复杂业务交易

  1. 几个不同的聚合实例
  2. 几个有界上下文

从表面上看,您似乎已经选择了委托复杂业务交易的选项二。

需要注意的是,当您使用 Sagas 时,您应该非常有意识地处理任何异常和/或命令调度结果。

因此,如果您从“Master”向“Slave 1”发送命令并且后者操作失败,则该结果将返回到 Saga。因此,这为您提供了重试操作的第一个选项,我建议您使用补偿操作。最后,通过补偿动作,我说的是调度一个命令来触发它。

如果您不能依赖调度命令的直接响应,那么在 Saga 中重试/重新安排消息将是一个合理的第二选择。

为此,Axon 拥有EventSchedulerand DeadlineManager。请注意,两者中的前者发布了一个活动供大家查看。后者DeadlineMessage在单个 Saga 实例的上下文中安排 a ,从而限制了谁可以看到重试正在发生的范围。

通常,这DeadlineManager将是我首选的操作模式,除非您要求每个人都可以看到此“重新安排操作”。仅供参考,请查看页面以EventScheduler获取信息,并查看页面以获取DeadlineManager信息。

样本更新

这里有一些伪代码来感受一下 Saga 事件处理程序中的补偿动作是什么样的:

class SomeSaga {

    private CommandGateway commandGateway;

    @SagaEventHandler(assocationValue = "some-key")
    public void on(SomeEvent event) {
        // perform some checks, validation and state setting, if necessary
        commandGateway.send(new MyActionCommand(...))
                      .exceptionally(throwable -> {
                                         commandGateway.send(new CompensatingAction(...));
                                     });
    }
}

推荐阅读