【发布时间】:2019-03-02 22:01:18
【问题描述】:
我有两项服务必须在两个系统上进行最少的更改集成:
- 第一个系统提供了一种使用 Azure 服务总线队列发送命令的方法。处理命令后,它会将有关已处理命令的事件(通过 Azure 服务总线主题)发送回发送初始命令的系统。
- 第二个服务(第三方)只能进行同步调用,由于某些技术限制,它不能使用 Message Brokers
完成所有这些后,我需要将第二个服务与第一个服务集成,我发现提供可以将同步调用转换为异步调用的 API 网关可能是有意义的。
我们使用:
- Spring Boot 2.0,Spring Cloud
- Java 9
- 天蓝色
- Azure 服务总线
我还没有找到任何可以将同步调用转换为异步的库或框架。无论如何,有一种方法可以定制解决方案:
- API Gateway 为秒服务提供 REST API。当第二个服务调用网关时,它会向 Azure 服务总线队列发送一个命令
- 应该在网关端实现某种等待机制,网关必须保持第二个服务连接打开并保持等待,直到收到第二个服务的事件。一旦它接收到事件,它就可以为来自第 3 方系统的同步调用构建响应
- 我很确定我们将面临同步调用超时结束并且我们还没有收到来自第一个服务的事件的情况。为了处理这种情况,我们必须回滚第一个服务处理的命令(这是某种补偿)
[![概念图][1]][1]
您对一些可以帮助实现满足我们需求的解决方案的知名库或模式有什么建议吗?
我还想说,我理解同步转换异步是不自然的,还有其他一些方法,例如在处理命令时使用 web-hook 或回调 url 将响应发送回调用者。 不幸的是,第三方服务无法为此提供此类 API。
似乎有一个链接显示并命名了这种从同步到异步的转换 - https://dzone.com/articles/patterns-for-microservices-sync-vs-async。 它被称为同步包装器
【问题讨论】:
-
我也有类似的情况。你解决了吗?
标签: azure asynchronous microservices synchronous gateway