RabbitMQ-Go 性能分析

更多個人筆記見:
注意點擊“繼續”,而不是“發現新項目”
github個人筆記倉庫 https://github.com/ZHLOVEYY/IT_note
gitee 個人筆記倉庫 https://gitee.com/harryhack/it_note
個人學習,學習過程中還會不斷補充~ (后續會更新在github上)

文章目錄

    • 對比功能
        • 沒有rabbitMQ
        • 有rabbitMQ
        • wrk 測試分析

鏈接: 項目連接,完整項目代碼倉庫下載
https://gitee.com/harryhack/it_note/tree/main/%E5%90%8E%E7%AB%AF%E7%AC%94%E8%AE%B0/%E5%B8%B8%E7%94%A8Web%E6%8A%80%E6%9C%AF/RabbitMQ

對比功能

為了說明 RabbitMQ 的引入有什么好處!

  • 下載wrk
    brew install wrk
  • 測試指令:
    wrk -t 10 -c 100 -d 30s --latency http://localhost:8080/posts -s post.lua
    
    -t:使用 ??10 個線程?? 并發發送請求。
    -c:總共建立并保持 ??100 個 TCP 連接??(即并發數)。
    -d 30s:測試持續 ??30 秒??。
    –latency:在測試結束后,輸出 ??延遲統計信息
    -s post.lua:指定 lua 腳本
  • lua 腳本:
wrk.method = "POST"
wrk.body   = '{"title":"Test Post","content":"This is a test"}'
wrk.headers["Content-Type"] = "application/json"
沒有rabbitMQ

圖見倉庫中
![[…/…/…/…/attachments/Pasted image 20250601114039.png]]

有rabbitMQ

![[…/…/…/…/attachments/Pasted image 20250601115515.png]]

wrk 測試分析
  • 請求延遲
    有 RabbMQ整體效果更好,平均值低了 9倍
    有 RabbMQ 的里,50% 請求延遲:6.21ms,99% 請求延遲:74.02ms 都顯著更好
  • 吞吐量
    顯然有 RabbitMQ 的總吞吐量更大(總的 request 和每秒的 request)
  • 穩定性
    查看請求延遲百分比以及 stdev (越小越好)可以發現,有 RabbitMQ 更加穩定

補充:

  • RabbitMQ 支持多個消費者并行處理消息,通過增加消費者實例(–scale app=3)可進一步提高吞吐量和降低延遲。
    • docker-compose up --scale app=3
  • 同步版本受限于 MySQL 寫入性能,擴展性較差(需優化數據庫,如分片或讀寫分離)
  • 停止消費者,發送 100 個請求然后查看 http://localhost:15672 可以檢查數據的完整性(存在里面)

疑問:

  • 問:為什么同樣都是數據庫讀取,RabbitMQ 的話我的理解就是中間“多了一個管道”這樣,但是數據庫還是一個個讀取的,理論上應該加了 rabbitMQ 的延遲更高么?
    答:雖然 RabbitMQ 增加了一個中間層(消息隊列),但它帶來的 異步處理 和 解耦 效應顯著降低了 API 端的延遲
    • 沒rabbitMQ 的同步版本流程:
      • 用戶發送 POST /posts 請求。
      • Gin 服務接收請求,解析 JSON 數據。
      • Gin 直接調用 GORM 將帖子寫入 MySQL(db.Create(&post))。
      • 等待 MySQL 完成寫入操作(包括磁盤 I/O、事務提交等)。
      • 返回響應給用戶。
        延遲來自:MySQL 寫入延遲:通常在 10-50ms 級別(取決于數據庫負載、索引、鎖等)。以及高并發下,MySQL 可能出現鎖競爭或連接池瓶頸,進一步增加延遲
    • 異步版本有 RabbitMQ 流程:
      • 用戶發送 POST /posts 請求。
      • Gin 服務接收請求,解析 JSON 數據。
      • Gin 將帖子序列化為 JSON,推送至 RabbitMQ 隊列(ch.Publish)。
      • 立即返回響應給用戶(不等待數據庫寫入)。
      • 消費者(后臺 goroutine)從 RabbitMQ 隊列讀取消息,調用 GORM 寫入 MySQL。
        延遲來自:推送消息到 RabbitMQ:通常在 1-2ms 級別(RabbitMQ 是內存操作,速度很快)。API 響應時間僅包含推送消息的耗時,不包括數據庫寫入。
        結論:RabbitMQ 并沒有增加 API 請求的延遲,而是將數據庫寫入的延遲“轉移”到消費者端

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908114.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908114.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908114.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI助力Java開發:減少70%重復編碼,實戰效能提升解析

工具再先進,也替代不了編程思維的深度錘煉 在Java開發領域,重復編碼如同無形的生產力黑洞——以商品管理模塊開發為例,開發者耗費大量時間編寫SQL查詢、處理結果集轉換;用戶系統里,密碼加密和狀態管理的代碼在不同項目…

JS語法筆記

目錄 JS數組Array新建數組一維數組二維數組 reverse()在數組末尾插入:push()在數組末尾刪除:pop()在數組開頭插入:unshift()從數組開頭刪除一個元素shift()splice() MapSet JS數組Array 判斷數組相等不能用,要循環判斷 新建數組…

uniapp-商城-77-shop(8.2-商品列表,地址信息添加,級聯選擇器picker)

地址信息,在我們支付訂單上有這樣一個接口,就是物流方式,一個自提,我們就顯示商家地址。一個是外送,就是用戶自己填寫的地址。 這里先說說用戶的地址添加。需要使用到的一些方式方法,主要有關于地址選擇器,就是uni-data-picker級聯選擇。 該文介紹了電商應用中地址信息處…

網頁前端開發(基礎進階3--Vue)

Vue3 Vue是一款用于構建用戶界面的漸進式的JavaScript框架。 Vue由2部分組成:Vue核心包,Vue插件包 Vue核心包包含:聲明式渲染,組件系統。 Vue插件包:VueRouter(客戶端路由),Vuex…

大模型相關技術綜述

多模態大模型&大模型訓練語料持續迭代 已經開始整理多模態-視覺部分: 主要分為一下幾塊 多模態信息壓縮模型(clip、vit、swiT) 生成模型(vae、gan、flow、ddpm、sde…) 其它多模態大模型(語音、視頻、slam、3…

Vue3中Ant-design-vue的使用-附完整代碼

前言 首先介紹一下什么是Ant-design-vue Ant Design Vue 是基于 Vue 3 的企業級 UI 組件庫(同時兼容 Vue 2),是螞蟻金服開源項目 Ant Design 的 Vue 實現版本。它遵循 Ant Design 的設計規范,提供豐富的組件和高質量的設計體系&…

建造者模式:優雅構建復雜對象

引言 在軟件開發中,有時我們需要創建一個由多個部分組成的復雜對象,這些部分可能有不同的變體或配置。如果直接在一個構造函數中設置所有參數,代碼會變得難以閱讀和維護。當對象構建過程復雜,且需要多個步驟時,我們可…

如何通過akshare庫,獲取股票數據,并生成TabPFN這個模型 可以識別、處理的格式(并進行了訓練、推理)

計劃讓AI幫助編程使用TabPFN模型進行股價推理 原計劃提問的prompt 如何通過akshare庫,獲取股票數據,并生成TabPFN這個模型 可以識別、處理的格式 本意是想讓AI分步執行,先處理股票數據,然后再進行模型訓練,結果豆包超…

[藍橋杯]最大化股票交易的利潤

最大化股票交易的利潤 題目描述 實現一個算法尋找最大化股票交易利潤的策略。介紹如下: 股票價格每天都在變化,以數組的索引表示交易日,以數組的元素表示每天的股票價格。可以通過買入和賣出獲得利潤。一天只能進行一次買入或賣出操作&…

URL 結構說明+路由(接口)的認識

一、URL 結構說明 以這個為例:http://127.0.0.1:5000/zhouleifeng 1.組成部分: http://:協議 127.0.0.1:主機(本地地址) :5000:端口號(Flask 默認 5000) /zhouleifeng&#xff1a…

微服務商城-用戶微服務

數據表 用戶表 CREATE DATABASE user; USE user;CREATE TABLE user (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 用戶ID,username varchar(50) NOT NULL DEFAULT COMMENT 用戶名,password varchar(50) NOT NULL DEFAULT COMMENT 用戶密碼,MD5加密…

Java面試題及答案整理( 2025年最新版,持續更新...)

最近發現網上很多Java面試題都沒有答案,所以花了很長時間搜集整理出來了這套Java面試題大全,希望大家能夠喜歡! 注:篇幅有限,資料已整理成文檔,后臺si我666,我一個個發! 這套面試文…

[論文閱讀]PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning

PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning | IJCAI IJCAI-22 發表于2022年的論文,當時大家還都在做小模型NLP的相關工作(BERT,Ro…

Redis最佳實踐——性能優化技巧之集群與分片

Redis集群與分片在電商應用中的性能優化技巧 一、Redis集群架構模式解析 1. 主流集群方案對比 方案核心原理適用場景電商應用案例主從復制讀寫分離數據冗余中小規模讀多寫少商品詳情緩存Redis Sentinel自動故障轉移監控高可用需求場景訂單狀態緩存Redis Cluster原生分布式分片…

Vue 生命周期全解析:從創建到銷毀的完整旅程

Vue 生命周期是每個 Vue 開發者必須深入理解的核心概念之一。它定義了組件從創建、掛載、更新、銷毀的整個過程,以及在這個過程中各個階段提供的鉤子函數。掌握生命周期不僅能幫助你理解 Vue 的工作原理,還能讓你在合適的時機執行特定的操作,…

【Rust 高級trait】Rust trait的一些高級用法解密

?? 歡迎大家來到景天科技苑?? 🎈🎈 養成好習慣,先贊后看哦~🎈🎈 🏆 作者簡介:景天科技苑 🏆《頭銜》:大廠架構師,華為云開發者社區專家博主,…

聯想電腦護眼衛士與系統顏色配置(X-Rite)沖突 | 顯示設置頻繁變換色階 - 解決方案

聯想電腦護眼衛士與系統顏色配置X-Rite沖突 | 顯示設置頻繁變換色階 - 解決方案 前言方案1:解決聯想護眼衛士方案2:解決系統顏色配置(X-Rite) 前言 自帶X-Rite軟件的聯想電腦(以拯救者Y9000P,Win11系統為例)&#xff…

MySQL中SELECT查詢的執行順序

MySQL中SELECT查詢的執行順序 在日常的數據庫開發中,我們經常會寫各種復雜的SELECT查詢語句。然而,很多開發者對于MySQL實際執行這些查詢的順序并不完全了解。理解查詢的執行順序不僅有助于編寫更高效的SQL語句,還能幫助我們更好地優化查詢性…

es 的字段類型(text和keyword)

Text 當一個字段是要被全文檢索時,比如 Email 內容、產品描述,這些字段應該使用 text 類型。設置 text 類型以后,字段內容會被分析,在生成倒排索引之前,字符串會被分析器分詞。text類型的字段不用于排序,很…

MySQL安裝及啟用詳細教程(Windows版)

MySQL安裝及啟用詳細教程(Windows版) 📋 概述 本文檔將詳細介紹MySQL數據庫在Windows系統下的下載、安裝、配置和啟用過程。 📥 MySQL下載 官方下載地址 官方網站: https://dev.mysql.com/downloads/社區版本: https://dev.my…