高并发下的耗时操作

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

请求流程图

http1 http2 http3

thread1 thread2 thread3

解决方案

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

代码实现

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

/**

* 异步建立高并发的订单.

*

* @return

*/

@GetMapping("/create-order")

public DeferredResult createOrder() {

DeferredResult 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 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耗时操作阻塞_spring boot高并发下耗时操作的实现方法相关推荐

  1. java 项目启动初始化_Spring Boot解决项目启动时初始化资源的方法

    前言 在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初 ...

  2. java耗时操作阻塞_springboot~高并发下耗时操作的实现

    高并发下的耗时操作 官方文档中说DeferredResult和Callable都是为了异步生成返回值提供基本的支持.简单来说就是一个请求进来,如果你使用了DeferredResult或者Callabl ...

  3. mysql springboot 缓存_Spring Boot 整合 Redis 实现缓存操作

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 产品没有价值,开发团队再优秀也无济于事 – <启示录> 』 本文提纲 一.缓 ...

  4. java 自动启动监听_Spring Boot 启动事件和监听器,太强大了!

    大家都知道,在 Spring 框架中事件和监听无处不在,打通了 Spring 框架的任督二脉,事件和监听也是 Spring 框架必学的核心知识之一. 一般来说,我们很少会使用到应用程序事件,但我们也不 ...

  5. springboot高并发下耗时操作的实现,我先收藏为敬

    什么是 Arthas? Arthas 是一款开源在线诊断工具,采用命令行交互模式,支持 web 端在线诊断,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断.这是一款开源一年多 G ...

  6. java 过滤攻击报文_Spring Boot XSS 攻击过滤插件使用

    XSS 是什么 XSS(Cross Site Scripting)攻击全称跨站脚本攻击,为了不与 CSS(Cascading Style Sheets)名词混淆,故将跨站脚本攻击简称为 XSS,XSS ...

  7. java ldap userpassword 解密_Spring Boot中使用LDAP来统一管理用户信息

    LDAP简介 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的数据库系统,其专门针对读 ...

  8. java metrics 简书_Spring Boot Metrics

    Spring Metrics https://docs.spring.io/spring-metrics/docs/current/public/prometheus Spring Boot Metr ...

  9. java程序 启动慢_spring boot 程序启动缓慢的问题

    今天发现一台服务器上的springboot程序启动特别慢,完全启动起来用了有好几分钟.刚开始以为是代码写的有问题造成了卡死,直到看到这条log: 2017-03-08 10:06:49.600 INF ...

最新文章

  1. leangoo思维导图工具
  2. leetcode — maximum-subarray
  3. java多态 降低代码耦合性_深度分析:理解Java中的多态机制,一篇直接帮你掌握!...
  4. The way to Go(6): Go程序的基本结构和要素
  5. java 事件分发线程_Java事件调度线程说明
  6. 跟我一起写 Makefile(七)
  7. php post登录跳转,php实现post跳转
  8. consul历史版本下载地址
  9. JavaWeb笔记04-解决GET与POST乱码问题
  10. redis使用指南(一)
  11. bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp
  12. EasyUI——DataGrid中嵌入Radio
  13. 视频教程-产品原型图设计Axure教程-Axure
  14. 设置Visual Studio代码折叠
  15. 如何将html放到虚拟主机上
  16. 如何用计算机算十进制,计算器怎么,计算机是怎么转换二进制为十进制的
  17. win10系统中如何查看wifi密码
  18. linux安装程序出现了问题,linux安装extundelete以及对遇到问题的解决
  19. Java的LockSupport.park()实现分析(转载)
  20. 开源棋牌框架creator+skynet:牛牛+五子棋

热门文章

  1. Eclipse在过去十年中的主要成就
  2. php把表单转为json保存,javascript – 使用jquery将表单数据保存到本地json文件中
  3. 电商系统下单时商品库存和销售状态如何处理
  4. 网关 Spring Cloud Gateway
  5. centos rpm安装mysql5.5_CentOS下以RPM方式安装MySQL5.5
  6. 公里与英里的换算c语言函数_60迈=60码=60公里?这三者天壤之别,可别搞错了
  7. java调用kafka接口发送数据_Java调用Kafka生产者,消费者Api及相关配置说明
  8. Mysql存储函数实现增删改查_使用存储过程操作数据库(实现增删改查)
  9. java中读取单个字符_如何使用Java中的Scanner类读取单个字符?
  10. 热敏电阻温度特性曲线_NTC热敏电阻如何选型