java - Axon Framework:具有两个或三个微服务之间补偿事件的 Saga 项目
问题描述
我有一个关于 Axon Saga 的问题。我有一个项目,我有三个微服务,每个微服务都有自己的数据库,但是两个“从”微服务必须将他的数据共享给“主”微服务,因为我想使用 Axon Saga。我已经问了一个关于赔偿的问题,当出现问题时,我必须自己处理赔偿,可以,但并不理想。目前我正在使用 DistributedCommandBus 在微服务之间进行通信,这样做有好处吗?我正在使用 Choreography Saga 模型,所以它现在看起来像这样:
- Master -> Send command -> Slave1 -> Handles event
- 从站1 -> 发回命令 -> 主站 -> 处理事件
- Master -> 发送命令 -> Slave2 -> 处理事件
- 从站 2 -> 发回命令 -> 主站 -> 处理事件
如果出现问题,则补偿命令/事件会倒退。
我的问题是,有没有人对 Axon 做过这样的事情,有补偿,最好的做法是什么?如何重试 Saga 进程?使用 RetryScheduler?如果可以的话,添加一个 github 仓库。
谢了哥们
解决方案
首先,让我回答你的主要问题:
我的问题是有人用 Axon 做过这样的事情吗?
很快,是的,因为这是 Sagas 的主要用例之一。根据经验,我想说 Saga 可用于协调以下之间的复杂业务交易:
- 几个不同的聚合实例
- 几个有界上下文
从表面上看,您似乎已经选择了委托复杂业务交易的选项二。
需要注意的是,当您使用 Sagas 时,您应该非常有意识地处理任何异常和/或命令调度结果。
因此,如果您从“Master”向“Slave 1”发送命令并且后者操作失败,则该结果将返回到 Saga。因此,这为您提供了重试操作的第一个选项,我建议您使用补偿操作。最后,通过补偿动作,我说的是调度一个命令来触发它。
如果您不能依赖调度命令的直接响应,那么在 Saga 中重试/重新安排消息将是一个合理的第二选择。
为此,Axon 拥有EventScheduler
and 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(...));
});
}
}
推荐阅读
- android - 如何显示下一张/上一张卡片 RecyclerView 的一部分
- sql-server - SQL Server 并发用户限制 1 - 锁定
- angular - 材料单选按钮内的角度材料表单字段不会触发单选按钮
- node.js - 如何从在 AWS ecs 上使用 docker 部署的应用程序获取日志
- sql - 如果为空则插入数据
- python - 使用 python3 将值插入 SQLite3 DB 表时出错
- linux - 我在 Linux 中的 Windows 文件夹在哪里?
- android - 使用 API 注册后,真实 android 设备中的网络请求失败错误
- java - 在 IntelliJ 2018.1 的编辑器中显示所选类名的源代码
- python - 如何在python中的while循环结束时打印所有输出