跨服务共享轴突查询

问题描述

我正在运行三个不同的服务(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)时:我找不到查询处理程序异常
  2. 当我使用queryGateway.subscriptionQuery( findCourierByIdQuery,initialResponseType,updateResponseType)时:我一无所有
  3. 当我使用queryGateway.scatterGather( findCourierByIdQuery,responseType,timeout,timeUnit)时:我得到了一个空流

当我从服务B本身触发findCourierByIdQuery时,将调用queryhandler并得到正确的响应。

我的观察是,查询处理程序仅在查询是从同一组件(在这种情况下为服务B)触发的情况下才被调用,如果我从其他组件(服务A)触发查询则不会被调用)。

请注意,所有服务都在不同的主机和端口上独立运行,但是连接到相同的axonserver,并且查询句柄写在服务B中。

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

  • findCourierByIdQuery是在通用api服务中定义的。
  • 服务A和B具有公共api服务的依赖性。
  • 服务A对findCourierByIdQuery进行查询
  • 服务B具有findCourierByIdQuery查询处理程序实现。

解决方法

我认为这很好!

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

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

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

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

最好, 伊万