java - 跨服务共享轴突查询
问题描述
我正在运行三个不同的服务(A、B 和 C),并且都连接到 axonserver 4.3.3。除了它们之外,我还有一个包含所有事件的 api 服务,以便它可以在所有服务之间共享。当一个事件被触发时(让我们说服务 A)它正在被其他服务(B & C)监听并做出相应的反应。
现在我也想共享查询,以便当服务(比如说 A)想要一些属于另一个服务(比如说 B)的信息时,它可以直接触发相应的查询,该查询将由服务 B 侦听并返回信息。
- 在轴突中是否允许(即,在服务之间共享查询,就像我们对事件所做的那样)?
- 如果允许,它是否遵循轴突最佳实践?
- 如果不允许/不遵循最佳实践,什么是替代解决方案?
更新
我只是将查询添加到 common-api 服务并从服务 A 中触发它,如下所示:
- 当我使用时
queryGateway.query( findCourierByIdQuery, responseType)
:我得到了 queryhandler not found 异常 - 当我使用时
queryGateway.subscriptionQuery( findCourierByIdQuery, initialResponseType, updateResponseType)
:我什么都没有 - 当我使用时
queryGateway.scatterGather( findCourierByIdQuery, responseType, timeout, timeUnit)
:我有一个空流
当我从服务 B 本身触发 findCourierByIdQuery 时,查询处理程序被调用并且我得到了正确的响应。
我的观察是,查询处理程序仅在查询已从同一组件(在本例中为服务 B)触发时才被调用,如果我从其他组件(服务 A)触发查询,则不会调用它。
请注意,所有服务都独立运行在不同的主机和端口上,但连接到同一个 axonserver 并且查询处理程序编写在服务 B 中。
所以基本上实现是这样的:
- findCourierByIdQuery 是在通用 api 服务中定义的。
- 服务 A 和 B 具有公共 api 服务的依赖关系。
- 服务 A 对 findCourierByIdQuery 进行查询。
- 服务 B 具有 findCourierByIdQuery 查询处理程序实现。
解决方案
在我看来,这完全没问题!
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)
在下游系统中拥有反腐败层组件将使您的服务自治。
最好的,伊万
推荐阅读
- python - 根据单个特征分解预测
- go - Golang 中 ECDSA 签名验证使用 secp256r1/scep384r1/secp521r1 性能差异
- angular - 无法识别@angular/material?
- javascript - 如何重用在 npm 模块内的 app 模块中创建的 mongoose 连接
- c# - 10m * 0.1m 在 C# 中是否等于 1m?
- java - Java 8 优化代码转换 Json 结构
- c# - 单数和复数的问题
- android - Imageview 自动调整加载到其中的图像
- sql - 简单的 SQL CASE 问题 - 从 WHERE 到 CASE 函数
- javascript - Apexchart 图表更新系列功能不起作用?