• DeferredResult解决了什么问题


    一、概念与背景

    Servlet3.0提供了异步处理请求的特性,DeferredResult 是spring基于 Servlet 3.0 对异步请求的支持实现,目的是对于请求提供异步处理方式,释放容器连接,支持更多的并发。或者基于它的超时机制来做一些长轮训相关的事情。

    二、应用场景

    1.服务端消息推送

    • apollo配置变更,客户端通过长轮训请求服务端,服务端通过DeferredResult实现变更通知
    • 消息推送,对于一些服务端发生变更,需要向客户端发送消息通知的场景,不管是C/S还是B/S模式,也可以通过DeferredResult来实现

    2.增加系统吞吐量

    拿tomcat作为servlet容器来说,无论是计算型请求还是io型请求,都是交给tomcat容器线程来建立连接和负责业务逻辑处理,如果将io型请求或者rt比较高的请求业务逻辑处理,通过DeferredResult来实现,那么可以尽早地释放连接线程,业务逻辑交由业务线程池处理,那么连接线程池可以接收更多的请求,从而提高了系统吞吐量。

    三、使用方式

    1.编写DeferredResult返回类型api

    1. @GetMapping("/deferredresult/test")
    2. public DeferredResult<String> testDeferredResult(long sleepTime) {
    3. DeferredResult<String> deferredResult = new DeferredResult<>(5000L,"server side timeout");
    4. executorService.submit(() -> {
    5. try {
    6. Thread.sleep(sleepTime);
    7. deferredResult.setResult("server response successfully");
    8. } catch (InterruptedException e) {
    9. log.error("occur error",e);
    10. }
    11. });
    12. return deferredResult;
    13. }
    14. 复制代码

    2.接口调用

    这样就完成了DeferredResult异步调用,当然我们也可以在DeferredResult设置超时相关逻辑。

    四、原理与源码分析

    为了方便理解,找了一张图来看一下DeferredResult做了什么事情。

    • 接收到请求后,将请求暂存并且释放容器线程,用来接收新的请求
    • 容器超时逻辑和业务正常处理逻辑将结果塞到DeferredResult返回调用

    spring对于DeferredResult请求处理

    1.请求预处理

    当然DeferredResult处理逻辑也脱离不了spring mvc的支持,也是要走到DispatcherServlet来处理请求:

    1. protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    2. HttpServletRequest processedRequest = request;
    3. HandlerExecutionChain mappedHandler = null;
    4. boolean multipartRequestParsed = false;
    5. //1.生成异步管理器
    6. WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    7. try {
    8. try {
    9. ModelAndView mv = null;
    10. Object dispatchException = null;
    11. try {
    12. //省略...
  • 相关阅读:
    RPA的尽头是超自动化?
    Disruptor在流程编排中的应用与探索
    LLM实战(一)| 使用LLM抽取关键词
    雷达波形之一——LFM线性调频波形
    网络-网络状态&网络速度
    [机器视觉]halcon应用实例 边缘检测2
    《大数据之路:阿里巴巴大数据实践》-第4篇 数据应用篇 -第16章 数据应用
    关于三维布尔运算的几点思考
    漏洞复现-docker容器逃逸与研究
    【cloud Alibaba】(一)服务注册和配置中心——Nacos
  • 原文地址:https://blog.csdn.net/ch98000/article/details/126750230