[Java实战]性能优化qps从1万到3万

news2025/3/16 3:41:24

一、问题背景

​ 事情起因是项目上springboot项目提供的tps达不到客户要求,除了增加服务器提高tps之外,作为团队的技术总监,架构师,技术扛把子,本着我不入地狱谁入地狱的原则,决心从代码上优化,让客户享受到飞一般的感觉。虽然大多数编程工作在写下第一行代码时已经完成,但本着谦虚使人进步,骄傲使人落后的原则还是一步一个脚印的把问题慢慢展开,慢慢分析。以下内容是抽丝剥茧的心路历程,请君欣赏。

二、TPS与 QPS

​ 说到性能优化就要说到高并发,说到高并发就要说到Tps和Qps。或许是小白第一次见到这个概念,但高手都是从低手走过来的,所以请高手以及高高手们,允许小人啰嗦的叙说吧!

以下是TPS(Transactions Per Second)与QPS(Queries Per Second)的核心区别及关联解析:

2.1. 定义与组成差异

  1. TPS(每秒事务数)
    • 定义:单位时间内系统完成的完整事务数量,一个事务包含从客户端请求到服务端处理并返回的全流程(例如:订单支付包含下单、扣款、生成凭证等多个操作)。
    • 组成:通常包括三个阶段:
    ◦ 客户端发起请求
    ◦ 服务端处理(含业务逻辑、数据库操作等)
    ◦ 服务端返回响应结果。

  2. QPS(每秒查询数)
    • 定义:单位时间内服务端响应的独立查询请求数量,通常指单个接口或操作的调用次数(例如:一次商品详情页查询)。
    • 组成:仅针对单一请求的响应,不涉及多步骤业务逻辑。

2. 应用场景与关系

指标 适用场景 与事务的关联性 典型示例
TPS 完整业务流程(如电商下单) 一个事务可能包含多个QPS(如支付流程涉及库存查询、支付接口调用) 支付系统需关注TPS以评估整体业务处理能力
QPS 单一接口或查询(如API调用) 单个查询可能属于某个事务的组成部分 商品搜索接口需关注QPS以优化响应速度

关系公式
• 当单事务仅包含一次查询时,TPS = QPS
• 当单事务包含多次查询时,QPS = TPS × 单事务内查询次数
• 系统整体吞吐量受限于性能最差的环节(如数据库瓶颈可能导致高QPS但低TPS)

3. 性能测试中的差异

  1. 测试目标
    • TPS反映系统处理复杂业务链路的综合能力(如银行转账事务)
    • QPS更关注接口层或服务的单点性能(如高并发下的缓存查询)

  2. 瓶颈分析
    • TPS低可能由事务中某个子环节(如第三方支付接口延迟)导致,需定位具体步骤
    • QPS低通常与服务器资源(CPU、内存)或代码效率直接相关

  3. 优化策略
    • 提升TPS:优化事务内耗时最长的环节(如数据库批量操作、异步处理)
    • 提升QPS:减少单次查询的响应时间(如索引优化、缓存命中率)

4. 总结

核心区别:TPS衡量完整业务流程的吞吐量,QPS衡量单一操作的频率。
选择依据:需根据业务场景决定主优化方向:
• 电商大促需优先保障TPS(确保订单流程不积压)
• 搜索引擎需优先优化QPS(提升单次查询效率)
关联性:两者共同构成系统吞吐量的评估体系,实际应用中常需结合分析。

​ 通过以上专业的介绍,想必各位已经知道了什么是Tps还是Qps了,如果各位还是不明白,那不能怪你们,要怪就怪小人说的太专业了。

​ 知道了客户想要的是什么,那么接下来就好办了,结合本身提供的api服务所使用的技术架构就很容易想到NIO和BIO,因为springboot项目打成jar包后是用的内嵌的tomcat,而tomcat7之前是BIO模式,sprinboot2.x内嵌的tomcat已经是8以上了,在spirngboot自动配置中,创建tomcat实例,默认启用NIO连接器。这一不小心又说的专业了,那BIO与NIO又是什么呢?对于小白来说,满脸的黑人问号,而高手只是轻轻一笑,这小伙子又在搞什么名堂,且待我慢慢看来。

三、BIO与NIO

​ 从TPS和QPS,再到BIO与NIO,各位看官辛苦了。虽然说是“书山有路勤为径,学海无涯苦作舟”,但是方法不对,努力全费,知道了需求,怎么去解决,那么了解BIO和NIO就是正确的解决之道了。

BIO(Blocking I/O)和NIO(New I/O 或 Non-blocking I/O)是两种常见的I/O模型,它们在处理网络请求和数据传输时有显著的区别,适用于不同的应用场景。

1. BIO(Blocking I/O)

  • 定义:BIO是同步阻塞I/O模型。线程在执行I/O操作时会被阻塞,直到数据准备完成。
  • 工作原理:每个连接都需要一个独立的线程来处理,线程在等待数据时无法执行其他任务。
  • 优点:实现简单,代码直观。
  • 缺点:线程资源消耗高,不适合高并发场景。
  • 适用场景:连接数较少且稳定的场景。

2. NIO(New I/O 或 Non-blocking I/O)

  • 定义:NIO是同步非阻塞I/O模型。线程在发起I/O请求后不会被阻塞,而是可以继续执行其他任务。
  • 工作原理:通过Selector(选择器)和Channel(通道)来管理多个连接。单个线程可以监听多个通道的I/O事件(如读、写、连接),从而实现高并发。
  • 优点:支持高并发,资源利用率高。
  • 缺点:编程复杂度较高,需要手动管理事件循环。
  • 适用场景:连接数多且连接较短(轻操作)的场景,如聊天服务器。

3. BIO与NIO的对比

特性 BIO NIO
阻塞模式 阻塞 非阻塞
数据处理方式 流(Stream) 块(Buffer)
核心组件 Socket/ServerSocket Channel/Buffer/Selector
并发能力 低(一线程一连接) 高(单线程多连接)
编程复杂度 简单 复杂

4. 应用领域

  • BIO:适用于低并发、简单应用场景,如内部工具或原型验证。
  • NIO:适用于高并发、实时通信场景,如API网关、聊天服务。

总结来说嘛,BIO和NIO各有优缺点,选择合适的I/O模型需要根据实际的业务需求和并发场景来决定。

​ 知道了目前已经是NIO模式了,那么怎么增加性能呢,换个语言不就得了,换个c吧,c是世界上最好的语言,嗯,是个不错的选择,换go吧,go是世界上最好的语言,嗯,这个也不错。想的都对,但还是用Java,Java是世界上最好的语言。

于是在一番思索后,依旧使用Java,因为 gRPC 实现依赖了netty,所以netty应该能满足客户的需求,那接下来就是见证奇迹的时刻, “实践是检验真理的唯一标准” ,是骡子是马是时候该拉出来溜溜了。

四、Netty方案

在薅掉十几根头发后,终于写出了这个替代方案,代码如下:

package com.example.demo;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据-spark3.5安装部署之standalone模式

真实工作中还是要将应用提交到集群中去执行,Standalone模式就是使用Spark自身节点运行的集群模式,体现了经典的master-slave模式。集群共三台机器,具体如下 u22server4spark: master worker u22server4spark2: worke…

技术视界|构建理想仿真平台,加速机器人智能化落地

在近期的 OpenLoong 线下技术分享会 上,松应科技联合创始人张小波进行了精彩的演讲,深入探讨了仿真技术在机器人智能化发展中的关键作用。他结合行业趋势,剖析了现有仿真平台的挑战,并描绘了未来理想仿真系统的设计理念与实现路径…

AutoGen多角色、多用户、多智能体对话系统

2023-03-11-AutoGen 使用【autoGenchainlitdeepSeek】实现【多角色、多用户、多智能体对话系统】 1-核心思路 01)技术要点:autoGenchainlitdeepSeek02)什么是autoGen->autogen是微软旗下的多智能体的框架03)什么是chainlit-&g…

SQL99 多表查询

内连接: select name, depart_name, city from employee e join department d on e.depart_id d.depart_id join location l on d.locat_id l.locat_id; 外连接 注:本图取自博客园大佬"anliux"的博客,原帖链接:【学…

sql靶场5-6关(报错注入)保姆级教程

目录 sql靶场5-6关(报错注入)保姆级教程 1.第五关 1.步骤一(闭合) 2.步骤二(列数) 3.报错注入深解 4.报错注入格式 5.步骤三(数据库表名) 6.常用函数 7.步骤四(表…

矩阵分析-浅要理解(深度学习方向)

梯度分析与最优化 在深度学习的任务中,我们所期望的是训练一个神经网络,使得预测结果与真实标签之间的误差最小化,这可以近似看作是一个提供梯度下降等优化找到全局最优解的凸优化问题。 奇异值分解 在信息工程领域,对数据处理的…

校园安全用电怎么保障?防触电装置来帮您

引言 随着教育设施的不断升级和校园用电需求的日益增长,校园电力系统的安全性和可靠性成为了学校管理的重要课题。三相智能安全配电装置作为一种电力管理设备,其在校园中的应用不仅能够提高电力系统的安全性,还能有效保障师生的用电安全&am…

第十五届蓝桥杯大学B组(握手问题、小球反弹、好数)

一、握手问题 思路1&#xff1a; 1)先让所有人相互握手 第一个人49次 第二个人48次 第五十个人0次 共计01249 2)减去7个没握手的 016 #include<stdio.h> int main() {int a 50*49/2 - 7*6/2;printf("%d\n",a);return 0; } 运行结果&#xf…

【教学类-43-26】20240312 数独4宫格的所有可能(图片版 576套样式,空1格-空8格,每套65534张*576小图=3千万张小图)

背景需求&#xff1a; 之前做了三宫格所有可能图片 510小图*12套6120图&#xff0c;所以3分钟就生成了 【教学类-43-25】20240311 数独3宫格的所有可能&#xff08;图片版 12套样式&#xff0c;空1格-空8格&#xff0c;每套510张&#xff0c;共6120小图&#xff09;-CSDN博客…

如何手动使用下载并且运行 QwQ-32B-GGUF

首先使用安装 pip install ModelScope 使用 ModelScope 下载对应的模型 modelScope download --model Qwen/QwQ-32B-GGUF qwq-32b-q4_k_m.gguf 第二步开始下载 ollama git clone https://githubfast.com/ggerganov/llama.cpp # githubfast.com 可以加速下载 切换到目录&am…

Spring Boot对接twilio发送邮件信息

要在Spring Boot应用程序中对接Twilio发送邮件信息&#xff0c;您可以使用Twilio的SendGrid API。以下是一个简单的步骤指南&#xff0c;帮助您完成这一过程&#xff1a; 1. 创建Twilio账户并获取API密钥 注册一个Twilio账户&#xff08;如果您还没有的话&#xff09;。在Twi…

约束优化技术:KKT条件的完整推导与应用

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 ima 知识库 知识库广场搜索&#…

对比文章相似度的余弦相似度算法的原理

近期不是项目遇到对比代码的相似度&#xff0c;来判断代码是否存在抄袭嘛。通过研究采用了余弦相似度来对比。既然接触的一个新的东西&#xff0c;怎么也得研究下吧。 一、什么是余弦相似度 利用余弦相似度对比文章相似度的原理&#xff0c;主要基于向量空间模型&#xff0c;通…

DeepSeek结合Mermaid绘图(流程图、时序图、类图、状态图、甘特图、饼图)转载

思维速览&#xff1a; 本文将详细介绍如何利用DeepSeek结合Mermaid语法绘制各类专业图表&#xff0c;帮助你提高工作效率和文档质量。 ▍DeepSeek入门使用请看&#xff1a;deepseek保姆级入门教程&#xff08;网页端使用 本地客户端部署 使用技巧&#xff09; DeepSeek官网…

玩转云服务器——阿里云操作系统控制台体验测评

在云服务器日益普及的背景下&#xff0c;运维人员对操作系统管理工具的要求不断提高。我们需要一款既能直观展示系统状态&#xff0c;又能智能诊断问题&#xff0c;提供专业指导的控制台。阿里云操作系统管理平台正是基于API、SDK、CLI等多种管理方式&#xff0c;致力于提升操作…

Linux 安装 Oh My Zsh

1. 简介 Zsh&#xff08;Z Shell&#xff09;是一款功能强大的 Shell&#xff0c;相比 Bash 提供了更强的 自动补全、命令高亮、插件支持 等功能。而 Oh My Zsh 是一个 Zsh 的增强管理工具&#xff0c;让你可以轻松安装插件和主题&#xff0c;极大提高开发效率。 本教程将详细…

方差,协方差及协方差矩阵的计算

1.方差 方差是用来衡量一组数据的离散程度&#xff0c;数序表达式如下: σ 2 1 N ∑ i 1 N ( x i − μ ) 2 \sigma^2\frac1N\sum_{i1}^N(x_i-\mu)^2 σ2N1​i1∑N​(xi​−μ)2 σ 2 σ^2 σ2表示样本的总体方差&#xff0c; N N N 表示样本总数&#xff0c; x i x _i xi​…

DeepSeek-R1思路训练多模态大模型-Vision-R1开源及实现方法思路

刚开始琢磨使用DeepSeek-R1风格训练多模态R1模型&#xff0c;就看到这个工作&#xff0c;本文一起看看&#xff0c;供参考。 先提出问题&#xff0c;仅靠 RL 是否足以激励 MLLM 的推理能力&#xff1f; 结论&#xff1a;不能&#xff0c;因为如果 RL 能有效激励推理能力&#…

Unity 创建签名证书、获取签名证书信息,证书指纹

目录 一&#xff1a;创建签名证书 二&#xff1a;自动填写密码 ​编辑 三&#xff1a;获取签名证书的信息 后言 &#x1f451;&#x1f451;&#x1f451; 一&#xff1a;创建签名证书 首先确保Unity是安卓打包&#xff0c;然后按图操作 会打开下图页面 选择你要创建到的…

在AIStudio飞桨星河社区一键部署DeepSeek-r1:70b模型

随着DeepSeek的火热&#xff0c;市面上出现大量的第三方的API服务区&#xff0c;但是对于对安全、隐私、控制有一定需求的用户&#xff0c;还是会希望能够自主部署DeepSeek 。 实践下来&#xff0c;用自己的机器部署是一条解决之道&#xff0c;但是推理起来&#xff0c;cpu和内…