跨服务共享轴突查询

sharing axon queries across services

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

现在我也想分享查询,这样当一个服务(假设 A)想要一些属于另一个服务(假设 B)的信息时,它可以直接触发相应的查询,该查询将被服务 B 和将 return 信息。

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

UPDATE

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

  1. 当我使用 queryGateway.query( findCourierByIdQuery, responseType) 时:我得到查询处理程序未找到异常
  2. 当我使用queryGateway.subscriptionQuery( findCourierByIdQuery, initialResponseType, updateResponseType)时:我什么都没有
  3. 当我使用 queryGateway.scatterGather( findCourierByIdQuery, responseType, timeout, timeUnit) 时:我得到一个空流

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

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

注意,所有服务运行独立于不同的主机和端口,但连接到同一个axonserver,queryhandler写在服务B中。

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

我觉得这完全没问题!

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 处理程序。通常,这种基于查询 API 的集成不是完全自动化的:从查询到命令的转换涉及用户。在这种情况下,服务 B(下游)正在使用(服务 A 的)查询响应来呈现用户可以从中发出下一个命令(服务 B)的视图

在下游系统中拥有 anti-corruption 层组件将使您的服务自治。

最好的, 伊万