微服务架构怎么实现异步请求?

image.png
请求:
请问各位前辈,我现在一个项目中希望去减低一个API接口的平均响应时间;这个接口存在微服务1,这个业务逻辑需要先请求微服务2,再请求微服务3中的接口获得对应的信息,微服务2需要一定的处理时间,由于这种模式下是同步调用,程序需要去等待微服务2的处理结果后再来请求微服务3,故会导致在并发的情况下系统的吞吐量下降。
我现在的想法是希望通过异步调用的方法提高吞吐量(相应需要缓存已经处理过了),不知道这样的方法是否可行,其次是我用的技术栈是sringboot+springcloud+mysql+redis,springcloud是否有提供相应异步请求的功能。
谢谢大家的解惑!


修改如下:image.pngimage.png
请问各位我这样修改合理吗,但是我改完了以后API的平均响应时间反而变长了,且端口异常率达到60%?
对于平均响应时间变长了,是不是我直接同步请求两个微服务所需的时间反而比并发发起请求的时间要短,毕竟线程的切换什么也是需要时间的。
对于异常率提高,有可能是我线程池的设置不合理。

阅读 3.4k
5 个回答

如果微服务2和微服务3没有关联,那这两个请求可以并发,将调用微服务2和微服务3的操作放到线程池中执行,用CountDownLatch来等待两个请求都返回后再继续往下走。推荐用1.8的CompletableFuture的allOf,代码更简便

我想你应该想要的是 DeferredResult

@GetMapping("/")
public DeferredResult<ResponseData> request() {
    DeferredResult<ResponseData> deferredResult = new DeferredResult(10000L);
    new Thread(() -> {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
        }
        // 这里返回结果
        deferredResult.setResult()
    }).start();
    // 异步返回
    return deferredResult;
}

可否让 Service1 提供一个 Callback 接口,Service2 完毕后调用 Callback 接口通知 Service1,Service1 接收到通知后再请求 Service3。

图片.png

可以了解一下Webhook,通过这个方式来解决异步请求应该能行得通。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏