同步到异步http请求和响应架构

问题描述 投票:0回答:2

我们正在开发一个 REST 服务 (2),充当黑盒 客户端 (1) 和黑盒 处理器微服务 (4) 之间的适配器。

(2) 和 (4) 使用 Kafka (3)

相互通信

所有组件都是无状态的(除了 Kafka,对吧?)

首先,Client使用http POST(同步)向REST服务发起命令,然后REST服务接受该命令并通过Kafka(异步)将其转发到处理器ms(在进行一些转换之后) 。 在此步骤之后,REST服务将休眠(此http范围)并等待来自处理器ms

的结果

然后 Processor ms 处理此命令,并通过 Kafka(异步)将结果发送回 REST 服务REST 服务 唤醒,并将 ResponseEntity 返回到同一 http 范围内的 Client

现在我们决定将 (2) 迁移到微服务以利用此架构。问题出现了:(2)的实例1向(4)发送命令,(4)将结果发送给实例2。但是(1)和实例1之间建立了http会话,实例2无法返回( 1)。此返回必须由且仅由实例 1 完成。

我的第一个想法是,例如,让实例1知道(4)的结果,无论它被发送到哪个实例。但目前我们还没有解决方案来归档这个想法。

这是示意图

我们需要针对此架构的“非解决方案”解决方案。请帮忙。谢谢你

注意:我们无法更改黑盒组件

java spring architecture microservices spring-webflux
2个回答
0
投票

这有点简单 - 简而言之:您需要确保只查找正确的事件。

这意味着结果队列上发布的事件必须可识别为特定客户端而不是其他客户端。例如,您可以通过包含指南来做到这一点。

随后,您的 REST 服务将继续寻找结果事件,但会丢弃它们,除非它们表明它们适用于他的特定客户端。

这是显示这一原理的图表。请注意,REST 服务仅查找“客户端 1”事件:


0
投票

就我个人而言,我会:

  • 像 Oswin 提出的任一过程,并为每个 RestService 实例创建一组消费者。这确保了 each RestService 实例可以使用 every 响应事件,但仅处理与预期 uuid 匹配的事件
  • 或者(似乎更优化)为每个 RestService 实例创建一个响应主题,并在命令事件中发送响应主题的名称。消费者应该在正确的响应主题中发送响应事件。这样,每个 RestService 实例将读取其响应主题,并且接收和处理他作为接收者的响应事件
© www.soinside.com 2019 - 2024. All rights reserved.