外部事件处理 Axon

External event handling Axon

我正在开发基于 Axon 3 的应用程序,想知道处理来自外部系统或服务的事件的首选方式是什么。
想象一下这样的情况:我要求另一个服务为我做某事,对此某事的回答可以解释为一个事件并由一个 saga 处理。

现在我可以想到 2 个选项来处理这个事件:

  1. 将响应转换为命令并应用事件,但在这种情况下,您将有一个像 MarkSomethingHappendCommandSomethingHappendEvent 这样的命令。你需要一个聚合来处理这个。
  2. 在响应处理程序中使用 EventStore 实例,将响应转换为 SomethingHappendEvent 并执行 eventStore.publish(event) 激活 saga 以继续处理。

从 Axon 框架的角度来看,直接使用事件总线来发布这样的事件是否有效? 这种方式是否也可以防止计时问题,例如来自其他服务的响应比提交发起调用的 UOW 更快?

提前致谢!

首先,我想指出的是,您正在处理来自另一个限界上下文的事件,您正在将其拉入您的主应用程序(同样,一个不同的限界上下文)。

说到"spoken language",a.k.a。 Messages/API 在一个限界上下文中,一切都应该是public 知识。 但是,在限界上下文之间,您应该有意识地共享。

知道这一点,我 肯定会 建议将外部服务事件转换为您自己的应用程序中完全不同的消息(/对象)。 将其转换为命令还是事件在很大程度上取决于 此外部服务事件描述的内容。 你可以给这个 "translation layer" 起一个名字是反腐败层,它的目标是确保你的本地 application/context 不被外部信息破坏。

关于您提供的两个选项,我想分享以下内容。

请注意,您不一定必须将命令指向聚合。例如,命令处理程序也可以添加到 bean(如 https://docs.axoniq.io/reference-guide/implementing-domain-logic/command-handling/external-command-handler 所示)。 因此,如果您的翻译操作指定外部事件成为命令,则该命令可以转到任何服务来处理操作。

说到直接发布事件,我可以说这样做完全没问题。明智地排序,Axon 将总是 在发送消息时检查当前工作单元是否正在进行中。如果是这样,public事件将按顺序上演。因此,我不会在这里假设直接的时间问题,尽管这当然可能稍微取决于您的实现方式。

最后,我想指出 Axon 4.2 已经在几周前发布,而 4.0 已经快一年了。 因此,没有在 Axon 3.x 上进行积极的开发,这导致我建议您尽可能更新 Axon 版本。