首页 > 解决方案 > 跨服务共享轴突查询

问题描述

我正在运行三个不同的服务(A、B 和 C),并且都连接到 axonserver 4.3.3。除了它们之外,我还有一个包含所有事件的 api 服务,以便它可以在所有服务之间共享。当一个事件被触发时(让我们说服务 A)它正在被其他服务(B & C)监听并做出相应的反应。

现在我也想共享查询,以便当服务(比如说 A)想要一些属于另一个服务(比如说 B)的信息时,它可以直接触发相应的查询,该查询将由服务 B 侦听并返回信息。

  1. 在轴突中是否允许(即,在服务之间共享查询,就像我们对事件所做的那样)?
  2. 如果允许,它是否遵循轴突最佳实践?
  3. 如果不允许/不遵循最佳实践,什么是替代解决方案?

更新

我只是将查询添加到 common-api 服务并从服务 A 中触发它,如下所示:

  1. 当我使用时queryGateway.query( findCourierByIdQuery, responseType):我得到了 queryhandler not found 异常
  2. 当我使用时queryGateway.subscriptionQuery( findCourierByIdQuery, initialResponseType, updateResponseType):我什么都没有
  3. 当我使用时queryGateway.scatterGather( findCourierByIdQuery, responseType, timeout, timeUnit):我有一个空流

当我从服务 B 本身触发 findCourierByIdQuery 时,查询处理程序被调用并且我得到了正确的响应。

我的观察是,查询处理程序仅在查询已从同一组件(在本例中为服务 B)触发时才被调用,如果我从其他组件(服务 A)触发查询,则不会调用它。

请注意,所有服务都独立运行在不同的主机和端口上,但连接到同一个 axonserver 并且查询处理程序编写在服务 B 中。

所以基本上实现是这样的:

标签: javaspring-bootaxon

解决方案


在我看来,这完全没问题!

Axon 使用三种类型的消息:命令、事件和查询。它们代表您的服务的 API。下游服务(在您的情况下为 B&C)可以发送命令、订阅事件或发送(和订阅)上游服务的查询(在您的情况下为 A)。简单地说,B&C 依赖于 A。如果可能的话,使这种依赖关系是单向的(唯一的 B 依赖于 A,但不是相反)很重要。

通常,您希望anti-corruption layer component在下游服务 (B&C) 的边缘拥有一个。它可以将来自上游服务 (A) 的事件转换为自己的命令,并且可以将自己的事件转换为上游服务 (A) 的命令。这是 Saga 或常规事件处理程序(处理器)。

如果您对查询感兴趣,那么您anti-corruption layer component将使用查询网关从上游服务 (A) 发出(订阅)查询,并希望以自动方式将响应转换为命令,类似于我提到的 Saga/事件处理程序。通常,查询 API 上的这种集成不是完全自动化的:从查询到命令的转换涉及到用户。在这种情况下,服务 B(下游)正在使用(服务 A)的查询响应来呈现用户可以从中发出下一个命令的视图(服务 B)

在下游系统中拥有反腐败层组件将使您的服务自治。

最好的,伊万


推荐阅读