当前位置: 首页 > 知识库问答 >
问题:

如何使用事件源(axon框架)在一个saga中处理从REST-API传递的多个实体?

陶胤
2023-03-14

因此,目前我正在用axon框架实现一个saga,使用事件源和CQRS。

情况如下:

我有3个微服务,m1、m2和m3

用户在GUI中输入由m1、m2、m3分别处理和保存的3个实体e1、e2、e3的数据,因此M1->e1、M2->e2、M3->e3

现在来看看这个传奇的必要性:

e1没有e2就不能存在,e2没有E3就不能存在。

因此,所有3个实体必须由它们各自的服务成功创建,如果其中一个失败,则saga需要执行补偿事务以确保一致性。首先,m1创建e1,发出一个e1CreatedEvent,一个orchestrator发送一个createE2Command作为对此的反应,等等。

现在我的问题是:

如何获取/存储用户输入的信息?在单个RequestBody中?那我该怎么处理这些数据呢?因为它需要以某种方式缓存,以便与命令一起发送。

@Saga
public class ManagementSaga{

@Autowired
private transient CommandGateway commandGateway

@StartSaga
@SagaEventhandler
public void handle (e1CreatedEvent e1CreatedEvent){


  commandGateway.send (new CreateE2Command (e1CreatedEvent.Id, **HERE NEEDS TO BE THE INFO THAT THE USER CREATED PREVIOUSLY**)}}

我是否只创建一个对象来保存这三个实体的信息?感觉真的不对。

现在我明白了,也许选择这样的领域模型真的很糟糕,如果可能的话,应该避免它,但这是为了谨慎:-)

共有1个答案

徐丰茂
2023-03-14

在这种情况下,我的第一反应是完全质疑设计。似乎(微)服务是围绕实体设计的。这种类型的设计在某些情况下可能有效,但在其他情况下将不可避免地导致分布式整体。你面临的挑战暗示着后者。

从API的角度来看,交互和系统的设计方式似乎也不匹配。虽然每个定义不是错误的,但这也可能表明API不正确(没有正确反映系统的行为),或者行为模型不正确。

无论如何,要给出一个比“视情况而定”更有用的答案,您可以在多个命令甚至查询中获得单个交互结果。它不需要在所有情况下都有一个传奇。

 类似资料:
  • 让我们举一个电子邮件传奇的例子:当一个用户注册时,我们创建一个发布UserRegisterEvent的用户聚合,一个传奇将被创建,这个传奇负责确保注册电子邮件被发送给用户(电子邮件可能包含验证密钥、欢迎消息等)。 我们是否应该使用: > 用try/catch->缩放吗? 使用deadline是因为我们只使用“send”,而不处理命令的最终错误,这可能是发送失败(其他服务关闭,等等) 其它的呢? 还

  • null 我想要达到的目标 我希望由一个实例发布的事件只由同一个实例处理 如果instance1发布eventX,那么只有instance1应该处理eventX null

  • 问题内容: 在Django rest框架中,我可以使用danialfarid / ng-file- upload 上传单个文件 views.py: serializers.py: models.py: 当我尝试上传多个文件时。我进去 chrome开发人员工具:请求有效负载 响应: 我不知道如何编写用于上传多个文件的序列化程序。任何身体都请帮忙。 提前致谢 问题答案: 我设法解决了这个问题,希望对社

  • exception$10(errorcode.java:88)在org.axonframework.axonserver.connector.errorcode.convert(errorcode.java:182)在org.axonframework.axonserver.connector.command.command.command.axonservercommandbus$1.onnex

  • 这个问题与Axon Server/Framework的关系非常松散,因为我是在学习和尝试学习如何构建微服务时专门学习它的。由于在没有实际经验的情况下很难了解所有的架构模式(而且在没有一个大型应用程序来实际测试/构建的情况下,很难从实际经验开始),所以我在这里提出了很多理论(我的问题可能很愚蠢,对不起,我还在学习中)。 我下载了Axon Server,并成功地在三个独立的微服务中构建和运行了包含的g

  • 中的任何提示都非常感谢,谢谢。