【问题标题】:Interaction between different Aggregates in CQRSCQRS 中不同聚合之间的交互
【发布时间】:2019-08-13 16:36:21
【问题描述】:

所以我对 CQRS 有点陌生(虽然不完全是初学者)。我试图了解聚合交互的最佳实践。我读了一些关于在这些情况下使用集成事件(而不是域事件)的信息,还有一些关于域服务(据说会链接 2 个聚合),但在任何地方都找不到任何好的明确答案(尤其是在 @987654321 上) @

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

【问题讨论】:

  • 您认为入门指南有什么“特别”错误,@bleh10?如果您对如何改进有任何建议,您介意在参考指南问题跟踪器上分享吗? github.com/AxonIQ/reference-guide/issues
  • 没什么问题,只是周围的每个人都在提到域服务和集成事件来解决相关问题,但我在入门指南中没有发现任何相关内容,我个人觉得很奇怪。
  • 好吧,说得对。如果您在学习/使用 Axon Framework/Server 的过程中确实遇到了您在指南中非常遗漏的指针,请向我共享的存储库添加问题!我们一直在寻求改进我们的文档,以尽可能地帮助 Axon 的用户。

标签: java spring-boot aggregate cqrs axon


【解决方案1】:

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

这只是一种方法,还有更多方法,可能比这更复杂,但我希望它有助于了解全局。

【讨论】:

  • 将命令从一个微服务发送到另一个微服务是一种好习惯吗?还是在微服务 B 上有一个事件处理程序来响应来自服务 A 的事件并在微服务 B 内生成所有命令更好?
  • 事件在这里确实是最好的选择,因为微服务在没有其他微服务的情况下应该可以正常工作(即在这种情况下不等待响应)这是微服务的基本规则之一。在某些情况下,您不能使用事件来执行此操作,而必须直接使用命令,但应尽可能避免。如果您真的必须使用命令通过消息队列(又名总线)发送它,那么发送者不必知道接收者的确切位置。
  • 我个人认为,在您的服务之间共享命令、事件和查询是可以的,只要您有意识地这样做。您在应用程序上处理的命令实际上是该服务 API 的一部分,就像查询一样。另一方面,(微)服务发布的事件也是该服务 API 的一部分。因此,我不会那么大胆地​​声明从一项服务向另一项服务发送命令是不行的。
【解决方案2】:

CQRS 系统中组件之间的交互可以发生在几个层次上。 正如 Maxime 所建议的那样,在考虑它的过程中,通过微服务,非常清楚地显示了消息传递这一切的重点。

尽管如此,这也可以简单地发生在一个应用程序/单体应用程序中,该应用程序/单体应用程序具有多个聚合类型,它们一起需要触发一些操作。

我觉得 Maxime 正在为您提供所需的答案。您向其发送命令的聚合实例会自行执行操作,并且不会直接相互关联,根本。因此,您将对事件做出反应,作为启动两者之间互动的驱动力。

您可以通过拥有一个事件处理组件来做到这一点,该组件侦听事件并执行您正在处理的业务事务。 如果业务交易稍微复杂一点,看看 Saga's 可能是一个好的开始。

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

【讨论】:

  • 感谢您的回复(在此和其他帖子上)非常感谢!马克西姆所说的确实帮助我实现了我正在寻找的东西。您确实有一点,这超出了入门指南的范围。我会仔细看看(因为我对 Sagas 是什么只有一个大概的了解)
  • 很高兴听到这个消息!我确实希望该指南在这方面对您有所帮助,如果没有,请在您有时间的情况下分享!
  • 很抱歉在这里打扰您,但我有 this 问题以及与使用 axon 设置 mongo (config) 相关的问题,如果您能帮助我们,我们会很高兴!
  • 别担心@bleh10,我真的认为你在寻找我以帮助解决其他问题是一种荣幸!你刚才分享的问题我已经回复了。让我知道,在那边,它是否对你有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多