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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…