CQRS中不同聚合体之间的相互作用

问题描述 投票:0回答:2

所以我对CQRS有点新鲜(虽然不是一个初学者)。我正在尝试了解聚合交互的最佳实践。我在这些情况下阅读了一些关于使用集成事件(而不是域事件)的内容,还有一点关于域服务(可能会链接2个聚合),但在任何地方都找不到任何好的明确答案(特别是在axonIQ Getting Started guide上没有找到)

另一个不太相关的问题是,在分层体系结构中,通常我们将控制器直接链接到服务,并且该服务可以与其他服务(或repos)交互,而使用CQRS,控制器通常向聚合发送命令。因此,如果我的api调用需要与2个聚合进行交互,我是否必须构建一个可以从2个服务发送命令(或监听事件)的中间人服务?

java spring-boot aggregate cqrs axon
2个回答
2
投票

CQRS系统中组件之间的交互可以在几个级别上发生。在考虑它的过程中,正如Maxime建议的那样,微服务,非常清楚地显示了它的所有消息焦点。

无论如何,这可以简单地发生在一个Application / Monolith中,它有几个Aggregate类型,它们一起需要触发一些操作。

我觉得Maxime正在为您提供所需的答案。您发送命令的Aggregate实例,根据它们自己行动,并且根本不直接绑定到彼此。因此,您将对事件做出反应,作为启动两者之间相互作用的驱动力。

您可以通过使用事件处理组件来监听这两个事件并执行您正在处理的业务事务。如果商业交易稍微复杂一些,那么看看Saga可能是一个好的开始。

最后,您指出Axon参考指南的“入门”部分不清楚此主题。我认为这是一个有效的结论,从Axon的角度来看,这不是入门指南的一部分。查看指南的Saga部分,了解聚合和/或有界上下文之间的相互作用。


1
投票

如果您从微服务(这是一种非常适合CQRS的理念)的角度来考虑这个问题,那么您应该为一个微服务提供一个聚合。因此,您无法在内存中的聚合之间进行通信,因为它们不属于同一进程。一个好方法是使用可以在事件总线中发布的事件。因此,客户端使用该微服务的API(即“微服务A”)(或者可能是API网关)向“聚合A”发送命令。然后保存“聚合A”并将“聚合A”生成的事件发布到事件总线,以便“微服务B”中的某个进程(也称为事件处理程序)可以捕获事件并将相应的命令发送到“聚合B”。

只有一种方法可以做到这一点还有更多,而且可能比这复杂得多,但我希望它有助于全面了解。

© www.soinside.com 2019 - 2024. All rights reserved.