我正在运行三个不同的服务(A,B和C),所有服务都已连接到axonserver 4.3.3。除了它们之外,我还包含一个包含所有事件的api服务,以便可以在所有服务之间共享它。当事件被触发时(由服务A说),其他服务(B和C)正在监听该事件,并且它们会做出相应的反应。
现在我也想共享查询,以便当一个服务(比如说A)想要属于另一个服务(比如说B)的某些信息时,它可以直接触发相应的查询,该查询将被服务B侦听并返回该信息。

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

  • 更新

    我只是将查询添加到common-api服务,并按如下所示从服务A触发了它:
  • 当我使用queryGateway.query( findCourierByIdQuery, responseType)时:我没有找到queryhandler异常
  • 当我使用queryGateway.subscriptionQuery( findCourierByIdQuery, initialResponseType, updateResponseType)时:我什么也没有得到
  • 当我使用queryGateway.scatterGather( findCourierByIdQuery, responseType, timeout, timeUnit)时:我得到了一个空流

  • 当我从服务B本身触发findCourierByIdQuery时,queryhandler被调用,并且我得到了正确的响应。
    我的观察是,查询处理程序仅在查询是从同一组件(在这种情况下为服务B)触发的情况下才调用的,如果我从其他组件(服务A)触发查询则不会被调用。
    请注意,所有服务都在不同的主机和端口上独立运行,但是连接到相同的轴突服务器,并且查询句柄写在服务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 / Event Handlers。 。通常,通过Query API进行的这种集成不是完全自动化的:从查询到命令的转换涉及用户。在这种情况下,服务B(下游)正在使用(服务A的)查询响应来呈现视图,用户可以从该视图发出下一个命令(服务B)
    在下游系统中具有反腐败层组件将使您的服务自治。
    最好,
    伊万

    10-07 16:16
    查看更多