spring boot高并发下耗时操作的实现方法

 更新时间:2019年11月18日 08:31:09   作者:张占岭  
这篇文章主要给大家介绍了关于spring boot高并发下耗时操作的实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

高并发下的耗时操作

高并发下,就是请求在一个时间点比较多时,很多写的请求打过来时,你的服务器承受很大的压力,当你的一个请求处理时间长时,这些请求将会把你的服务器线程耗尽,即你的主线程池里的线程将不会再有空闲状态的,再打过来的请求,将会是502了。

请求流程图

http1    http2        http3
thread1  thread2      thread3

解决方案

使用DeferredResult来实现异步的操作,当一个请求打过来时,先把它放到一个队列时,然后在后台有一个订阅者,有相关主题的消息发过来时,这个订阅者就去消费它,这一步可以是分布式的,比如一个秒杀场景,当N多的请求打过来时,有一些请求命中后,它们进行写操作,这时写操作压力很大,1个请求可以要处理3秒,对于高并发场景这是不能容许的,因为你这样占用的服务器线程资源太长了,很快你的服务器就没有可用的线程资源了,这时就可以用到DeferredResult这处理。

代码实现

建立订单的接口,只负责简单的校验和事件的发布

  /**
   * 异步建立高并发的订单.
   *
   * @return
   */
  @GetMapping("/create-order")
  public DeferredResult<Object> createOrder() {
    DeferredResult<Object> deferredResult = new DeferredResult<>((long) 3000, "error order");
    logger.info("发布建立订单的事件");
    applicationEventPublisher.publishEvent(deferredResult);
    return deferredResult;
  }

异步的订单处理核心逻辑,也是耗时的操作

@Component
@EnableAsync
public class OrderListener {

  static Logger logger = LoggerFactory.getLogger(OrderListener.class);

  /**
   * 事实上它是一个订单队列的消费者,在后台写订单,本例使用简单的事件监听器实现异步处理的功能.
   *
   * @return
   */
  @EventListener
  @Async
  public String processOrder(DeferredResult<Object> deferredResult) throws InterruptedException {
    logger.info("处理订单并返回到对应的Http上下文");
    String order = UUID.randomUUID().toString();
    Thread.sleep(2000);//假设处理数据需要5秒,前端需要阻塞5秒,但http主线程已经释放了,比较适合IO密集型场合
    //当设置之后,create-order将成功响应
    deferredResult.setResult(order);
    return order;
  }
}

测试结果

当请求/create-order后,服务器在处理2秒后,返回结果,而spring后台真正做的是,线程1在事件发布后,它成为空闲状态,其它请求可以复用它,当processOrder后台处理结果后,spring又会用线程池中拿一个新的线程处理剩下的逻辑!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • Java实现银行存取款

    Java实现银行存取款

    这篇文章主要为大家详细介绍了Java实现银行存取款,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • springboot项目如何设置时区

    springboot项目如何设置时区

    这篇文章主要介绍了springboot项目如何设置时区问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java设计模式中的观察者模式

    Java设计模式中的观察者模式

    观察者模式定义对象之间的一种一对多的依赖关系,使得每当一个对象的状态发生变化时,其相关的依赖对象都可以得到通知并被自动更新。主要用于多个不同的对象对一个对象的某个方法会做出不同的反应
    2023-02-02
  • springboot开启Bean数据校验功能

    springboot开启Bean数据校验功能

    这篇文章主要介绍了springboot开启Bean数据校验功能,通过启用Bean属性校验导入JSR303与Hibernate校验框架坐标,使用@Validated注解启用校验功能,需要的朋友可以参考下
    2023-10-10
  • Spring中Service注入多个实现类的方法详解

    Spring中Service注入多个实现类的方法详解

    这篇文章主要介绍了Spring中Service注入多个实现类的方法详解,Spring是一个开源的Java框架,用于构建企业级应用程序,它提供了许多功能,如依赖注入、面向切面编程、数据访问、Web开发等,需要的朋友可以参考下
    2023-07-07
  • MyBatis快速入门

    MyBatis快速入门

    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。想要学好它,那就要从MyBatis基础知识学起,下面跟着小编一起来看下吧
    2017-03-03
  • Java求字符串中出现次数最多的字符串以及出现次数

    Java求字符串中出现次数最多的字符串以及出现次数

    这篇文章主要为大家详细介绍了Java统计字符串中出现次数最多的字符串以及出现次数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java计算时间差和日期差五种常用示例

    Java计算时间差和日期差五种常用示例

    这篇文章主要给大家介绍了关于Java计算时间差和日期差五种常用示例的相关资料,最近工作中遇到需要计算时间差和日期差,搜索了几种计算时间差和日期差的方法,这里总结一下,需要的朋友可以参考下
    2023-08-08
  • Spring Boot实现邮件发送必会的5种姿势

    Spring Boot实现邮件发送必会的5种姿势

    这篇文章主要给大家介绍了关于Spring Boot实现邮件发送必会的5种姿势,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Java8 CompletableFuture详解

    Java8 CompletableFuture详解

    这篇文章主要介绍了Java8 CompletableFuture详解,CompletableFuture extends Future提供了方法,一元操作符和促进异步性以及事件驱动编程模型,需要的朋友可以参考下
    2014-06-06

最新评论