当前位置: 首页 > article >正文

RabbitMQ-Go 性能分析

更多个人笔记见:
github个人笔记仓库
gitee 个人笔记仓库
个人学习,学习过程中还会不断补充~ (后续会更新在github和 gitee上)

文章目录

    • 对比功能
        • 没有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 请求的延迟,而是将数据库写入的延迟“转移”到消费者端

相关文章:

RabbitMQ-Go 性能分析

更多个人笔记见: github个人笔记仓库 gitee 个人笔记仓库 个人学习,学习过程中还会不断补充~ (后续会更新在github和 gitee上) 文章目录 对比功能没有rabbitMQ有rabbitMQwrk 测试分析 链接: 项目连接,完整…...

【c++】【数据结构】红黑树

目录 红黑树的定义红黑树的部分模拟实现颜色的向上更新旋转算法单旋算法双旋算法 红黑树与AVL树的对比 红黑树的定义 红黑树是一种自平衡的二叉搜索树,通过特定的规则维持树的平衡。红黑树在每个结点上都增加一个存储位表示结点的颜色,结点的颜色可以是…...

基于SpringBoot+Redis实现RabbitMQ幂等性设计,解决MQ重复消费问题

解决MQ重复消费问题 一、实现方案 本方案参考 「RabbitMQ消息可靠性深度解析|从零构建高可靠消息系统的实战指南」,向开源致敬! 1、业务层幂等处理: 每个消息携带一个全局唯一ID,在业务处理过程中,首先检查…...

React从基础入门到高级实战:React 生态与工具 - React 单元测试

React 单元测试 引言 在现代软件开发中,单元测试是确保代码质量和可靠性的关键环节。对于React开发者而言,单元测试不仅能帮助捕获潜在的错误,还能提升代码的可维护性和团队协作效率。随着React应用的复杂性不断增加,掌握单元测…...

使用lighttpd和开发板进行交互

文章目录 🧠 一、Lighttpd 与开发板的交互原理1. 什么是 Lighttpd?2. 与开发板交互的方式? 🧾 二、lighttpd.conf 配置文件讲解⚠️ 注意事项: 📁 三、目录结构说明💡 四、使用 C 编写 CGI 脚本…...

DRF的使用

1. DRF概述 DRF即django rest framework,是一个基于Django的Web API框架,专门用于构建RESTful API接口。DRF的核心特点包括: 序列化:通过序列化工具,DRF能够轻松地将Django模型转换为JSON格式,也可以将JS…...

2024年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:有几个PAT 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位,第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位,第 4 位(A),第 6 位(T)。 现给定字符串,问一共可以形成多少个 PAT? 时间限制:1000 内存限制:26214…...

免费且好用的PDF水印添加工具

软件介绍 琥珀扫描.zip下载链接:https://pan.quark.cn/s/3a8f432b29aa 今天要给大家推荐一款超实用的PDF添加水印工具,它能够满足用户给PDF文件添加水印的需求,而且完全免费。 这款PDF添加水印的软件有着简洁的界面,操作简便&a…...

mqtt协议连接阿里云平台

首先现在的阿里云物联网平台已经不在新购了,如下图所示: 解决办法:在咸鱼上租用一个账号,先用起来。 搭建阿里云平台,参考博客: (一)MQTT连接阿里云物联网平台(小白向&…...

一文详谈Linux中的时间管理和定时器编程

(目录) 先说一些在计算机中需要用到时间的地方:系统日志log、OS调度(时间片、定时器)等等~~ 时间的计量 计时的方式发展:日晷、沙漏 -> 机械钟 -> 石英振荡器、晶振 -> 铯原子钟 -> 氢原子钟 计算机中的计时方式&…...

Ubuntu 安装 Miniconda 及配置国内镜像源完整指南

目录 Miniconda 安装Conda 镜像源配置Pip 镜像源配置验证配置基本使用常见问题 1. Miniconda 安装 1.1 下载安装脚本 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh1.2 执行安装 bash Miniconda3-latest-Linux-x86_64.sh按回车查看许可协议…...

性能优化 - 理论篇:常见指标及切入点

文章目录 引言一、 Java 性能优化的核心思路二、为什么要度量?三、常用性能衡量指标详解3.1 吞吐量与响应速度3.2 响应时间的具体度量:平均响应时间与百分位数3.3 并发量3.4 秒开率(页面秒开)3.5 正确性(功能可用性&am…...

青少年编程与数学 02-020 C#程序设计基础 08课题、字符和字符串

青少年编程与数学 02-020 C#程序设计基础 08课题、字符和字符串 一、字符和字符集1. 字符(Character)定义特点示例 2. 字符集(Character Set)定义特点常见字符集 小结 二、char数据类型1. 定义2. 特点3. 声明和初始化4. 转义字符示…...

【论文阅读 | PR 2024 |ICAFusion:迭代交叉注意力引导的多光谱目标检测特征融合】

论文阅读 | PR 2024 |ICAFusion:迭代交叉注意力引导的多光谱目标检测特征融合 1.摘要&&引言2.方法2.1 架构2.2 双模态特征融合(DMFF)2.2.1 跨模态特征增强(CFE)2.2.2 空间特征压缩(SFS)…...

Spring Security加密模块深度解析

Spring Security加密模块概述 Spring Security Crypto模块(简称SSCM)是Spring Security框架中专门处理密码学相关操作的组件。由于Java语言本身并未提供开箱即用的加密/解密功能及密钥生成能力,开发者在实现这些功能时往往需要引入额外依赖库。SSCM通过提供内置解决方案,有…...

华为OD机试真题——模拟消息队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《模拟消息队列》: 目录 题…...

MySql(十三)

目录 mysql外键约束 准备工作 创建表 插入数据 创建表时添加外键 1..格式 2..创建表student表时,为其添加外键 3.插入数据测试 正常数据 异常数据 3.使用alter添加外键 删除外键 添加外键 4.Mysql外键不生效的原因 修改引擎 phpystudy的mysql位置 mysql外键约束 注&…...

iOS —— UI 初探

简介 第一次新建时,你可能会好奇。为什么有这么多文件,他们都有什么用? App 启动与生命周期管理相关 文件名 类型 作用 main.m m 程序入口,main() 函数定义在这里 AppDelegate.h/.m h/m App 启动/进入后台/退出等全局事…...

day23-计算机网络-1

1. 网络简介 1.1. 网络介质 网线:cat5,cat5e 六类网线,七类网线,芭蕾网线光纤:wifi:无线路由器,ap5G 1.2. 常见网线类型 1.2.1. 双绞线(Twisted Pair Cable)【最常用】 按性能主…...

C语言基础(09)【数组的概念 与一维数组】

数组 数组的概念 什么是数组 数组是相同类型、有序数据的集合。 数组的特征 数组中的数据称之为数组的元素(数组中的每一个匿名变量空间,是同构的)数组中的元素存放在内存空间建立。 衍生概念:下标(索引) 下标或者索引代表…...

【JavaScript】Ajax 侠客行:axios 轻功穿梭服务器间

一、AJAX 概念和 axios 使用讲解 什么是 AJAX ? 使用浏览器的 XMLHttpRequest 对象与服务器通信 浏览器网页中,使用 AJAX技术(XHR对象)发起获取省份列表数据的请求,服务器代码响应准备好的省份列表数据给前端,前端…...

Django数据库连接报错 django.db.utils.NotSupportedError: MySQL 8 or later is required

可尝试换django版本 pip install django3.2.13 另外mysql下载地址 https://dev.mysql.com/downloads/installer/ 安装可以参考: https://blog.csdn.net/HHHQHHHQ/article/details/148125549 重点:用户变量添加 C:\Program Files\MySQL\MySQL Server …...

2025年- H57-Lc165--994.腐烂的橘子(图论,广搜)--Java版

1.题目描述 2.思路 3.代码实现 import java.util.LinkedList; import java.util.Queue;public class H994 {public int orangesRotting(int[][] grid) {//1.获取行数int rowsgrid.length;int colsgrid[0].length;//2.创建队列用于bfsQueue<int[]> quenew LinkedList<…...

2024 CKA模拟系统制作 | Step-By-Step | 16、题目搭建-sidecar 代理容器日志

目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. Sidecar 容器模式 2. 共享卷配置 3. 日志流式处理 4. 容器规范修改 三、考点详细讲解 1. Sidecar 模式架构 2. 关键组件解析 3. 日志流式处理原理 四、实验环境搭建步骤 1.编辑11-factor-app…...

(9)-Fiddler抓包-Fiddler如何设置捕获Https会话

1.简介 由于近几年来各大网站越来越注重安全性都改成了https协议&#xff0c;不像前十几年前直接是http协议直接裸奔在互联网。接着讲解如何抓取https协议会话。 2.什么是HTTPS&#xff1f; HTTPS就是加过密的HTTP。使用HTTPS后&#xff0c;浏览器客户端和Web服务器传输的数…...

Vue-Router 基础使用

Vue Router 是 Vue 官方的客户端路由解决方案。 客户端路由的作用是在单页应用 SPA 中将浏览器的 URL 和用户看到的内容绑定起来。当用户在应用中浏览不同页面时&#xff0c;URL 会随之更新&#xff0c;但页面不需要从服务器重新加载。 Vue Router 基于 Vue 的组件系统构建&a…...

【案例分享】蓝牙红外线影音遥控键盘:瑞昱RTL8752CJF

蓝牙红外线影音遥控键盘 Remotec的无线控制键盘采用瑞昱蓝牙RTL8752CJF解决方案&#xff0c;透过蓝牙5.0与手机配对后&#xff0c;连线至 Remotec 红外 code server 取得对应影音视觉设备的红外 code后&#xff0c;即可控制多达2个以上的影音视觉设备&#xff0c;像是智能电视…...

利用SQL批量修改Nacos配置

在Nacos的应用场景中&#xff0c;配置信息的管理至关重要。当需要对特定的配置进行批量修改时&#xff0c;SQL能成为我们强大的助力工具。本文将围绕如何使用SQL语句&#xff0c;依据特定条件修改Nacos的config_info表配置展开讲解。 一、操作前置准备 1. 数据备份 在对conf…...

网络协议的原理及应用层

网络协议 网络协议目的为了减少通信成本&#xff0c;所有的网络问题都是传输距离变长的问题。 协议的概念&#xff1a;用计算机语言来发出不同的信号&#xff0c;信号代表不同的含义&#xff0c;这就是通信双方的共识&#xff0c;便就是协议。 协议分层&#xff08;语言层和…...

Express教程【003】:Express获取查询参数

文章目录 3、获取URL中携带的查询参数3.1 参数形式&#xff1a;查询字符串3.2 参数形式&#xff1a;动态参数3.3 参数形式&#xff1a;Json数据 3、获取URL中携带的查询参数 3.1 参数形式&#xff1a;查询字符串 1️⃣通过req.query对象&#xff0c;可以访问到客户端通过查询…...