gpt4 book ai didi

java - 轴突框架 : Saga project with compensation events between two or three microservices

转载 作者:行者123 更新时间:2023-11-29 04:07:04 24 4
gpt4 key购买 nike

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

  1. Master -> 发送命令 -> Slave1 -> 处理事件
  2. Slave1 -> 发回命令 -> Master -> 处理事件
  3. Master -> 发送命令 -> Slave2 -> 处理事件
  4. Slave2 -> 发回命令 -> Master -> 处理事件

如果出现问题,则会向后提供补偿命令/事件。

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

谢谢,马特

最佳答案

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

My question is has anybody did something like this with Axon?

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

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

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

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

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

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

为此,Axon 拥有 EventSchedulerDeadlineManager。请注意,两者中的前者发布了一个事件供所有人查看。后者在单个 Saga 实例的上下文中安排一个 DeadlineMessage,从而限制谁可以看到重试发生的范围。

通常情况下,DeadlineManager 将是我的首选操作模式,除非您要求每个人都看到此“重新安排操作”。仅供引用,检查 this EventScheduler 信息和 this 的页面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(...));
});
}
}

关于java - 轴突框架 : Saga project with compensation events between two or three microservices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57919710/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com