10 | 如何使用异步设计提升系统性能

导入导出设计(导入篇) 导入交互设计、逻辑整理,一起学习呀 阅读详情

对开发者来说,异步是一种程序设计的思想,使用异步模式设计的程序可显著减少线程等待,从而在高吞吐的场景中,极大提升系统的整体性能,显著降低延时。

因此,像消息队列这种需要超高吞吐量和超低时延的中间件系统,在其核心流程中,一定会大量采用异步的设计思想。

接下来,我们一起来通过一个非常简单的例子学习,如何使用异步设计,提升系统性能。

异步设计如何提升系统性能?

假设我们要实现一个转账的微服务,Transfer(accountFrom, accountTo, amount),这个服务有三个参数:分别是转出,转入,金额。

实现过程也比较简单,要从账户A转账100元到账户B中:

1. 先从 A 的账户减 100 元

2. 再给 B 的账户加 100 元,转账完成

对应的时序图是这样:

client                                    transfer_service                                          account_service

     |-------Transfer(A, B, 100)------>  |  ------------------  Add(A,-100)-----------------> | 

     |                                                  |  <--------------------- OK -------------------------  |

     |                                                  |  ------------------  Add(B ,  100)----------------> |

     | <--------------OK ------------------- |  <--------------------- OK -------------------------  |

client                                    transfer_service                                          account_service

 

在这个例子的实现构成中,我们调用了另外的微服务 Add,功能是给账户增减金额。

特别说明,这段时序未做错误和事务处理,实际开发勿学。仅用于专注学习性能优化。

1. 同步实现的性能瓶颈

首先来看下同步实现。

首先从from扣钱,再从to加钱。分析一下代码性能,很容易计算出实现的微服务的transfer的平均响应时延大约等于两次 Add 的时延,也就是 100ms。随着调用 Transfer 服务的请求越来越多,每个请求100ms独占一个线程。一秒每个线程最多处理10个请求。每个机器上的线程资源并非无限,假使我们的服务器能同时打开的线程数量上线是1万。可计算出单服务器每秒的QPS为 10万。

如果请求超出,只能阻塞或者排队,此时transfer服务的响应时延由100ms延长到了:排队等待+处理时延。在大量请求下,微服务的平均响应时延变长。

但其实,此时机器CPU、内存、网卡流量、IO都空闲的很,因为1万个线程基本都在等待下游Add服务返回结果。

也就是说,采用同步实现,整个服务大部分的线程没在工作,都在等待。

若能减少或避免无意义等待,就可大幅提升服务的吞吐能力,从而提升服务总体性能。

2. 采用异步实现解决等待问题

接下来我们看一下,如何用异步思想来解决这个问题,实现同样的业务逻辑

先定义两个回调方法

  • OnDebit:扣减账户from后的回调方法
  • OnAllDone:转入账户 to 完成后的回调方法

改造后的整体异步语义是:

1. 异步从from的账户减去前述钱数,然后调用OnDebit

2. 在OnDebit中,异步把减去的钱加到to,然后执行 OnAllDone

3. 在OnAllDone中,调用OnComplete

client                                    transfer_service                                          account_service

     |-------TransferAsync ----------->  |  ------------------  AddAsync   ---------------->  | 

     |                                                  |  <----------------- OnDebit  ---------------------  |

     |                                                  |  ------------------  AddAsync   -----------------> |

     | <---------  OnComplete ---------- |  <--------------------- OnAllDone ---------------  |

client                                    transfer_service                                          account_service

会发现,异步化实现后,整个流程的时序和同步实现是完全一样的,区别只是在线程模型上由同步顺序调用改为了异步调用和回调的机制。

接下来分析一下异步实现的性能,由于流程和同步一致,低请求的时延仍然是100ms。在超高请求数量场景下,异步实现不再需要线程等待执行结果,只需要个位数量的线程,即可实现同步场景大量线程一样的吞吐量。

因为没有线程数量的限制,总体吞吐会超过同步,在CPU,内存,网络带宽,I/O的资源达到极限之前,响应时延不会随请求量增大而增加,几乎可以一直维持100ms。

简单实用的java的异步框架 CompletableFuture

略

小结

简单的说,异步思想就是,当我们要执行一项比较耗时的操作,不要等操作结束,而是给这个操作一个命令,当操作完成后接下来执行什么。

使用异步变成模型,虽然不能加快程序本身的速度,但可以减少或避免线程等待,只用很少的线程就可以达到超高的吞吐。

同时我们也需注意异步模型的问题,相比于同步实现,异步实现的复杂度要大很多,代码的可读性和可维护性都会显著下降。虽然使用异步编程框架简化了异步开发,但并不能解决模型高复杂度。

异步性能虽好,但不要滥用,只有类似消息队列这种业务逻辑简单并且要高吞吐的场景下,后者必须长时间等待资源的地方,才考虑使用一步模型。

若业务逻辑复杂,性能足够满足业务需求情况下,采用符合人类自然的思路且易于开发和维护的同步模型是更加明智的选择。

思考

第一个思考题:我们实现转账的时候,并没有考虑失败的处理。

如果调用账户服务失败,如何通知客户端。(callback中通知)

在两次调用账户服务失败时,如果某次失败,如何保证账户数据是平的。(首次失败后一步无需执行,第二次失败考虑重试,不能重试进行补偿,undo首次的转账。另一种想法是改造成单次调用的,下游进行单机事务操作。)

第二个思考题:

异步实现中,回调方法OnComplete是在什么线程中运行的。(OnAllDone)

是否能控制回调方法的执行线程数,该如何做?(原理是使用异步线程池控制回调方法的线程数。绑定回调到指定线程池执行即可)

3秒延迟?5步搞定SpringEvent:WebUploader大文件上传解耦效率飙升10倍! 摘要:SpringEvent技术在大文件上传场景中的解耦优势分析 本文通过对比传统同步处理与SpringEvent异步解耦方案,揭示大文件上传场景中的性能优化关键点: 传统同步方式存在代码耦合、响应延迟、扩展性差等问题(实测文件上传耗时30秒以上) SpringEvent方案通过事件驱动架构实现: 响应时间缩短90%(3秒内完成异步处理) 内存占用降低80%(500MB内) 扩展性提升(新增业务逻辑只需10分钟添加监听器) 实战演示5步解耦流程(自定义事件设计、异步线程池配置等关键代码) 性能对比数据:Sp 阅读详情

相关推荐

华为认证HCIA/HCIP/HCIE备考指南:从网络基础到排障实战

网络工程师的成长往往始于对路由交换、VLAN、OSPF等基础协议的扎实掌握。在真实项目交付与运维中,系统化的网络思维和排障能力,远比一张证书上的Logo更重要。华为认证的HCIA、HCIP、HCIE三级体系,恰好提供了一条从基础配置到复杂网络设计的进阶路径。针对备考中常见的“背题库”误区,更高效的方式是以实验为主线,用eNSP模拟器反复验证协议行为,把理论知识转化为肌肉记忆。无论你是刚入行的新人,还是工作数年的资深网工,都可以借助这套方法论梳理自己的知识地图,并在故障排查场景中快速定位问题。本文不贩卖焦虑,

weixin_34246551的博客 391

异步导入导出架构设计

为什么要用异步?在我们平时的业务系统中,文件导入,文件导出是一个很常见的业务需求。正常情况下,同步导出就可以满足我们80%的需求。但是对于数据量大,业务拼接复杂的系统来说...

架构文摘 3939

lw.PPOCR.C:纯C封装的Java原生OCR引擎

OCR(光学字符识别)作为基础AI能力,其在Java生态中的集成长期受限于跨语言调用、内存管理与部署复杂性。基于PaddleOCR C++推理引擎的纯C封装,通过标准化C ABI规避C++ ABI不兼容问题,结合JNA实现零JNI桥接,使OCR能力真正嵌入JVM进程。该方案显著降低延迟、消除网络开销、统一内存生命周期,并支持Alpine/Linux/Windows多平台二进制分发。适用于金融票据识别、政务文档处理、Spring Boot嵌入式OCR等对低延迟、高确定性与轻量部署有严苛要求的Java工程场景。

weixin_33829657的博客 348

设计模式:异步处理文件常用设计模式

设计模式:异步处理文件常用设计模式

m0_49464000的博客 827

异步处理设计方案

异步处理设计方案,针对于BS系统,看看是否可用,请大家指导

IAR许可证Generation 18代际不匹配问题解析与解决

IAR Embedded Workbench 的许可证机制采用‘代际(Generation)’模型,而非简单版本号匹配——这是一种基于数字签名算法、加密协议和硬件绑定策略演进的授权安全体系。Generation 18 是 v9.30 及以上版本强制要求的许可代际标准,对应 ECDSA 签名与增强型硬件指纹校验,旨在提升防破解能力与平台适配性。当旧版许可证(如 Generation 16/17)被用于新 IDE 时,启动器会在本地完成代际校验并直接拦截,导致‘The generation feature is

weixin_34203832的博客 341

Flink集成Redis组件,使用异步IO能完全解决性能瓶颈问题?

基于上述的问题,我们先来对异步IO有个大致的认识,了解的同学可以选择跳过。 流计算系统中经常需要与外部系统(Redis、MySQL等)进行交互,我们通常的做法如向数据库发送用户a的查询请求,然后等待结果返回,在这之前,我们的程序无法发送用户b的查询请求。这是一种同步访问方式,如下图所示。 图中棕色的长条表示等待时间,可以发现网络等待时间极大地阻碍了吞吐和延迟。为了解决同步访问的问题,异步模...

JK_GOME的博客 3042

EFR32无线SoC开发指南:从环境搭建到性能优化

物联网边缘设备开发中,无线SoC芯片的选择与开发环境配置是关键第一步。EFR32作为Silicon Labs推出的多协议无线SoC系列,配合Simplicity Studio IDE,为开发者提供了完整的解决方案。本文以EFR32xG22开发套件为例,详细介绍开发环境搭建、工程创建、硬件配置等核心环节,特别针对RAILtest示例工程进行深入解析。通过实际案例演示如何配置无线参数、优化低功耗模式,并分享串口终端交互、吞吐量测试等实战技巧。对于开发者常见的问题如设备识别失败、无线通信异常等,提供了系统化的排查

weixin_30342363的博客 352

10 | 如何使用异步设计提升系统性能?

对于开发者来说,异步是一种程序设计的思想,使用异步模式设计的程序可以显著减少线程等待,从而在高吞吐量的场景中,极大提升系统的整体性能,显著降低时延。 因此,像消息队列这种需要超高吞吐量和超低时延的中间件系统,在其核心流程中,一定会大量采用异步的设计思想。 接下来,我们一起来通过一个非常简单的例子学习一下,使用异步设计是如何提升系统性能的。 异步设计如何提升系统性能? 假设我们要实现一个转账的微服务 Transfer( accountFrom, accountTo, amount),这个服务有三个参数

一蓑烟雨任平生 705

绕过Google Play:获取Expo Go安卓APK的实用指南

本文为国内安卓开发者提供了绕过Google Play商店获取Expo Go APK的实用指南。针对无法访问Google Play的痛点,详细介绍了通过官方GitHub Releases、可信第三方网站(如APKMirror)及APK下载器等多种安全获取途径,并重点讲解了APK安装、安全验证(核对签名)及常见连接问题的排查方法,帮助开发者顺利开启React Native开发之旅。

weixin_29006701的博客 577

【DDR5 PCB走线SI/PI仿真调试】详细全攻略

问题场景发现症状优化措施过孔Stub效应TDR波形尖峰,信号反射严重使用盲孔,背钻减少Stub,降低Via数量串扰过大眼图闭合,误码率增加增加走线间距,插入地线隔离,减少平行长度电源阻抗过高PDN谐振导致纹波大多频率去耦,靠近电源引脚布置多档电容,合理分层信号时序失配优化走线长度匹配,避免信号走线跨层跳变DDR5设计不仅是硬件的挑战,更是仿真能力的考验。掌握SI/PI仿真,理解信号背后的物理本质,才能真正把握高速接口的“灵魂”!

weixin_43199439的博客 987

10个Tornado实战技巧:快速掌握异步Web开发核心

Tornado是一个强大的Python异步Web框架,专门为高性能网络应用设计。通过非阻塞I/O和协程机制,Tornado能够轻松处理数万个并发连接,是构建实时Web应用、长轮询服务和WebSocket应用的理想选择。本文将分享10个实用的Tornado开发技巧,帮助你快速掌握异步Web开发的核心要点。 ## 🚀 1. 快速搭建Hello World应用 从最简单的Hello World开始

gitblog_00413的博客 347

深度解析 Android 开发工程师岗位:技术栈、职责与面试全攻略

本文深度剖析Android开发工程师职位要求,从核心技术栈到面试准备进行全面解读。关键点包括:1)掌握Kotlin语言特性和Jetpack组件;2)具备UI开发、性能优化和逆向分析能力;3)理解MVVM架构和Room数据库;4)熟悉常用工具链和开发流程。文章提供了详细的面试题库及解析,涵盖基础概念、UI优化、架构设计等方向,并给出职业发展建议:夯实基础、拓展技术广度、培养工程素养。旨在帮助开发者系统性地准备Android岗位求职,把握移动开发领域的技术趋势。

郑伟强dev的专栏 172

架构师必备10大接口性能优化秘技

在软件开发中,接口性能优化是架构师必须掌握的关键技能之一。一个高效的接口不仅能够提升用户体验,还能减少服务器资源消耗,提高系统稳定性。本文将介绍10大接口性能优化秘技,并通过Java示例代码展示这些技巧在实际业务场景中的应用。

喜欢猪猪 1011

AutoSAR MemMap模块详解及使用注意事项

在本文中,我们将深入探讨MemMap模块的实例解析,并介绍在使用该模块时需要注意的一些事项。在上述代码中,我们使用了MEMMAP_START_SEC_VAR_32BIT和MEMMAP_START_SEC_CODE来定义MemMap区域的起始位置,使用MEMMAP_STOP_SEC_VAR_32BIT和MEMMAP_STOP_SEC_CODE来定义MemMap区域的结束位置。1.合理划分MemMap区域:根据实际需求,合理划分MemMap区域,将不同类型的变量放置在不同的区域中,以便于管理和访问。

weixin_50547796的博客 2532

用 ABAP EML 驾驭 RAP 业务对象:从事务缓冲区到落库提交的一条龙实践

摘要:ABAP EML(Entity Manipulation Language)是SAP RAP框架的核心语言能力,为ABAP开发者提供强类型、批处理友好的方式操作RAP业务对象。EML通过事务缓冲区管理数据变更,支持读取(READ ENTITIES)、修改(MODIFY ENTITIES)及事务控制(COMMIT/ROLLBACK ENTITIES)。其特点包括:基于BDEF派生类型确保类型安全,%control和%cid等特殊字段实现精细控制,统一的消息模型便于错误处理。相比传统ABAP数据访问方式,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 951

深入剖析通信层和RPC调用的异步化(上)

《Netty 进阶之路》、《分布式服务框架原理与实践》作者李林锋深入剖析通信层和 RPC 调用的异步化。李林锋此后还将在 InfoQ 上开设 Netty 专题持续出稿,感兴趣的同学可以持续关注。1. 异步的一些常见误区1.1.常见的理解误区在将近10年的平台中间件研发历程中,我们的平台和业务经历了从C++到Java,从同步的BIO到非阻塞的NIO,以及纯异步的事件驱动I/O(AIO)。服务器也从...

cpongo5 441

无监督学习与互信息

在机器学习中,获取大量高质量标注数据成本高昂。为解决此问题,无监督学习利用丰富的无标注数据成为研究重点。其中,互信息是衡量两个随机变量之间依赖关系的关键指标,能够捕捉非线性统计关联,非常适合处理非结构化数据。通过最大化神经网络中变量间的互信息,可以有效地从无标注数据中提取有用信息,提升模型在下游任务(如分类)的性能。互信息与熵密切相关,其值等于联合分布与边缘分布乘积间的KL散度,也可通过熵与条件熵的差值得出,具有对称性,并反映了已知一个变量后另一个变量不确定性的减少。

盼小辉丶的博客 3530

如何使用异步设计提升系统性能?

这一讲我们来聊一聊异步。对于开发者来说,异步是一种程序设计的思想,使用异步模式设计的程序可以显著减少线程等待,从而在高吞吐量的场景中,极大提升系统的整体性能,显著降低时延。因此,像消息队列这种需要超高吞吐量和超低时延的中间件系统,在其核心流程中,一定会大量采用异步的设计思想。接下来,我们一起来通过一个非常简单的例子学习一下,使用异步设计是如何提升系统性能的。

qq_33240556的博客 873

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 09 | 学习开源代码该如何入手?
下一篇: 10 | 如何实现高性能的异步网络传输
vectorX
博客等级 码龄11年 37粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值