API网关将同步调用转换为异步

时间:2018-09-27 04:13:14

标签: azure asynchronous microservices synchronous gateway

我有两个服务,必须在两个系统上进行最小程度的集成:

  1. 第一个系统提供了一种使用Azure Service Bus队列发送命令的方法。处理命令后,它将(通过Azure Service Bus主题)将有关已处理命令的事件发送回发送初始命令的系统。
  2. 第二服务(第三方)只能进行同步呼叫,由于某些技术限制,它不能使用Message Brokers

具有所有这些,我需要将第二个服务与第一个服务集成在一起,我发现提供可以将同步调用转换为异步调用的API网关可能是有意义的。

我们使用:

  • Spring Boot 2.0,Spring Cloud
  • Java 9
  • 天蓝色
  • 天蓝色服务巴士

我还没有找到任何可以将同步调用转换为异步调用的库或框架。无论如何,有一种方法可以定制解决方案:

  1. API网关提供REST API的秒服务。当第二个服务调用网关时,它将命令发送到Azure服务总线队列
  2. 应在网关端实施某种等待机制,网关必须保持第二个服务连接打开并保持等待状态,直到收到第二个服务的事件为止。接收到事件后,便可以为第三方系统的同步呼叫建立响应
  3. 我非常确定,当同步调用的超时时间结束并且我们没有收到来自第一个服务的事件时,我们将面对这种情况。为了处理这种情况,我们必须回滚由第一服务处理的命令(这是某种补偿)

[![显示概念的图] [1]] [1]

您对一些知名的库或模式有什么建议,可以帮助实现我们需要的解决方案吗?

我也想说我了解同步转换异步是不自然的,并且还有其他一些方式,例如在处理命令时使用Web钩子或回调URL将响应发送回调用者。 不幸的是,第三方服务无法为此提供此类API。

似乎有一个链接显示并命名了从同步到异步的转换-https://dzone.com/articles/patterns-for-microservices-sync-vs-async。 它被称为同步包装器

1 个答案:

答案 0 :(得分:1)

我建议不要忘记等待异步任务完成的网关。恕我直言,HTTP轮询和WebHooks是两个可能更好的解决方案。

HTTP轮询-客户端不断查询数据状态。
Web Hooks-事件由后台作业触发,并在作业完成后将数据发送到目标HTTP端点。