当前位置: 首页 > news >正文

深度解析响应式异步编程模型

上一篇文章中我们聊了一下线程池,基于线程池的多线程编程是我们在高并发场景下提升系统处理效率的有效手段,但却不是唯一的。今天我们来看一下另一种异步开发的常用手段-响应式编程模型

传统多线程模型的缺陷

多线程模型是目前应用最为广泛的并发编程手段,但凡遇到什么性能瓶颈,首先想到的就是弄个线程池把任务丢进去并发执行,但它其实存在一些明显的缺陷。我们先来看一个例子,在一个web服务中,某个接口需要完成如下的任务:

  1. 从数据库中查询一个数据
  2. 调用另一个微服务的接口拿到另一个数据
  3. 将两个数据组合起来并返回给用户

一个简化后的线程处理时序图可能是这样的:
在这里插入图片描述

从上图可以看出,不同用户的请求可以在线程池的线程并发的执行,但是单个用户的处理过程却仍然是串行执行的,而且由于数据库查询,调用微服务接口,写HTTP返回值都是典型的IO操作,导致线程大多数时间都处于阻塞状态。

如果是高并发场景,比如此时有1000个用户同时需要调用该接口,如果没有对线程池的数量加以限制的话,最高可能会创建1000个线程来处理用户请求,而这些昂贵的系统资源偏偏大部分时间都处于阻塞之中,这无疑是一个巨大的浪费。

响应式开发模型

看了上面的例子,小伙伴们很容易想到,如果线程在等待IO的过程中不需要保持活动状态,而能够去处理其它一些无需等待的任务&#x

相关文章:

  • 巧用newSingleThreadExecutor让异步任务顺序跑
  • 构建一个强大的小型虚拟负载
  • 记录SpringBoot启动报错解决
  • Spring IoC【控制反转】DI【依赖注入】
  • 爬虫逆向实战(41)-某花顺登陆(Cookie、MD5、SHA256)
  • 关于scrapy模块中间件的简单理解
  • 案例分享:高科技企业产品管理部门设置和产品经理岗位设置
  • MySQL 面试突击指南:核心知识点解析1
  • YOLOv10改进 | 注意力篇 | YOLOv10引入YOLO-Face提出的SEAM注意力机制优化物体遮挡检测
  • 改进YOLOv7 | 在 ELAN 模块中添加【Triplet】【SpatialGroupEnhance】【NAM】【S2】注意力机制 | 附详细结构图
  • 浏览器组成的介绍
  • QT中QSettings的使用系列之二:保存和恢复应用程序主窗口
  • bash: nvcc: command not found
  • 查看 MAC 的 shell 配置文件
  • 2024考古之还在用原始JDBC开发 手搓 案例 实现一个模块的增删改
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • dva中组件的懒加载
  • ES6--对象的扩展
  • Java基本数据类型之Number
  • laravel 用artisan创建自己的模板
  • MQ框架的比较
  • Python - 闭包Closure
  • Quartz初级教程
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 动态魔术使用DBMS_SQL
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 运行时添加log4j2的appender
  • 正则与JS中的正则
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (23)mysql中mysqldump备份数据库
  • (27)4.8 习题课
  • (33)STM32——485实验笔记
  • (C语言)字符分类函数
  • (Python) SOAP Web Service (HTTP POST)
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (十六)串口UART
  • (十七)、Mac 安装k8s
  • (转) Android中ViewStub组件使用
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • *p++,*(p++),*++p,(*p)++区别?
  • .DFS.
  • .Net 6.0 Windows平台如何判断当前电脑是否联网
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .netcore如何运行环境安装到Linux服务器
  • .NET上SQLite的连接
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @SentinelResource详解
  • [ 物联网 ]拟合模型解决传感器数据获取中数据与实际值的误差的补偿方法
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [ai笔记4] 将AI工具场景化,应用于生活和工作