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

一、问题背景

​ 事情起因是项目上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的对比

特性BIONIO
阻塞模式阻塞非阻塞
数据处理方式流(Stream)块(Buffer)
核心组件Socket/ServerSocketChannel/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.mzph.cn/pingmian/72296.shtml

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

相关文章

如何筛选能实现共享自助健身房“灵活性”的物联网框架?

共享自助健身房已经成为一种新兴的健身方式,这种模式方便快捷,尤其适合i人健身爱好者,市场接受度还是挺好的。对于无人自助式的健身房要想实现灵活性,要挑选什么样的物联网框架呢? 1. 支持多种通信协议 共享自助健身…

【后端】【django】抛弃 Django 自带用户管理后,能否使用 `simple-jwt`?

抛弃 Django 自带用户管理后,能否使用 simple-jwt? 一、结论 是的,即使抛弃了 Django 自带的用户管理(AbstractUser 或 AbstractBaseUser),仍然可以使用 django-rest-framework-simplejwt(简称…

【量化科普】Correlation,相关性

【量化科普】Correlation,相关性 🚀量化软件开通 🚀量化实战教程 在量化投资领域,相关性(Correlation)是一个核心概念,用于衡量两个变量之间的线性关系强度和方向。简单来说,它告…

大数据学习(68)- Flink和Spark Streaming

🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…

MCU详解:嵌入式系统的“智慧之心”

在现代电子设备中, MCU(Microcontroller Unit,微控制器)扮演着至关重要的角色。从智能家居到工业控制,从汽车电子到医疗设备,MCU以其小巧、低功耗和高集成度的特点,成为嵌入式系统的核心组件。 …

(链表)24. 两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,3,4] 输出:[2,1,4…

吴恩达机器学习笔记复盘(三)Jupyter NoteBook

Jupyter NoteBook Jupyter是一个开源的交互式计算环境: 特点 交互式编程:支持以单元格为单位编写和运行代码,用户可以实时看到代码的执行结果,便于逐步调试和理解代码逻辑。多语言支持:不仅支持Python,还…

【Linux】从互斥原理到C++ RAII封装实践

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

微服务无状态服务设计

微服务无状态服务设计是构建高可用、高扩展性系统的核心方法。 一、核心设计原则 请求独立性 每个请求必须携带完整的上下文信息,服务不依赖本地存储的会话或用户数据。例如用户认证通过JWT传递所有必要信息,而非依赖服务端Session。 状态外置化 将会话…

30、map 和 unordered_map的区别和实现机制【高频】

底层结构 map底层是红黑树结构,而unordered_map底层是哈希结构; 有序性 但是红黑树其实是一种二叉搜索树,插入删除时会自动排序hash因为是把数据映射到数组上的,而且存在哈希冲突,所以不能保证有序存储 所以有序存储使用map&a…

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

spark,一个数据处理框架和计算引擎。 下载 local模式即本地模式,就是不需要任何其他节点资源就可以在本地执行spark代码的环境。用于练习演示。 上传解压 使用PortX将文件上传至/opt 进入/opt目录,创建目录module,解压文件至/o…

Manus “Less structure,More intelligence ”独行云端处理器

根据市场调研机构Statista数据显示,全球的AR/AR的市场规模预计目前将达到2500亿美元,Manus作为VR手套领域的领军企业,足以颠覆你的认知。本篇文章将带你解读Manus产品,针对用户提出的种种问题,Manus又将如何解决且让使…

Oracle数据库存储结构--逻辑存储结构

数据库存储结构:分为物理存储结构和逻辑存储结构。 物理存储结构:操作系统层面如何组织和管理数据 逻辑存储结构:Oracle数据库内部数据组织和管理数据,数据库管理系统层面如何组织和管理数据 Oracle逻辑存储结构 数据库的逻…

芯驿电子 ALINX 亮相德国纽伦堡,Embedded World 2025 精彩回顾

2025年3月13日,全球规模最大的嵌入式行业盛会——德国纽伦堡国际嵌入式展(embedded world 2025)圆满落幕。 在这场汇聚全球 950 家展商、3 万余专业观众的科技盛宴中,芯驿电子 ALINX 展位人头攒动,多款尖端产品吸引客户…

Nexus File类型Blob Stores迁移至Minio操作指南(上)

#作者:闫乾苓 文章目录 目的前期准备查看file类型Blob Stores数据目录位置aws cli客户端连接工具OrientDB cli客户端连接工具在minio中新建 bucket 目的 增强nexus构件数据的高可用性和扩展性 前期准备 查看并记录需要迁移的Blob Store及repository 查看fil…

蓝桥杯嵌入式组第十二届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之,藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 LED模块1.3.3 LCD模块1.3.4 TIM模块1.3.5 UART模块1.3.5.1 uart数据解析 2.源码3.第十二届题目 前言:STM32G431RBT6实现嵌入式组第十二届题目解析源码&#…

【MySQL】表的约束(上)

文章目录 表的约束什么是表的约束空属性默认值列描述(comment)零填充(zerofill)主键 总结 表的约束 什么是表的约束 表的约束(Constraints)是数据库表中的规则,用于限制存储的数据&#xff0c…

【Unity网络同步框架 - Nakama研究(三)】

文章目录 【Unity网络同步框架 - Nakama研究(三)】准备工作前言Unity部分连接服务器创建并进入房间创建人物人物移动和同步 【Unity网络同步框架 - Nakama研究(三)】 以下部分需要有一定的Unity基础,在官方的案例Pirate Panic基础上进行修改而成。如果没有下载并熟悉…

前端存储-indexdb封装:dexie.js的使用

前言 indexedDB是一个用于在浏览器中存储较大数据结构的Web API,并且提供了索引功能以实现高性能查找。dexie.js是对indexdb的封装,前端用起来很方便。在此介绍一下项目中用到的操作语句,也方便记录。我的项目是vue3项目。 开始 1、安装 …

【AD】6-1 PCB常用规则

间距规则: 可自行修改线宽与间距(默认10mil) 线宽规则:电源线宽加粗 布线过程中更改线宽:走线状态下,shiftw更改线宽,线宽要在规则范围之内过孔规则: 阻焊规则: