[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.pswp.cn/pingmian/72296.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72296.shtml
英文地址,請注明出處:http://en.pswp.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更改線寬,線寬要在規則范圍之內過孔規則: 阻焊規則: