资讯动态

JMeter 3.3 追加 RabbitMQ 压测实战:生产者与消费者全链路性能测试

发布时间:2026/10/17 5:21:55 来源:尧图企业网站定制
简介本资源面向需要使用JMeter 3.3对RabbitMQ进行压力测试的测试工程师与后端开发人员提供一套可直接运行的实战工具包。内容围绕JMeter非HTTP协议支持展开涵盖AMQP Sampler等插件的集成、RabbitMQ连接参数配置、线程组并发模型设计以及聚合报告等监听器的结果分析帮助读者快速搭建消息队列压测环境。压缩包共2000个文件以1510个html、482个png、271个js等前端资源为主同时包含82个jar依赖、45个jmx测试脚本、58个lang语言包及37个xml配置整体约51.92MB目录结构完整便于按模块检索与二次修改。目前已有1089人学习下载适合希望掌握JMeter扩展协议压测、理解RabbitMQ高并发性能表现的读者参考实践。1. 当压测工具遇上消息队列为什么 JMeter 3.3 还要追加 RabbitMQ 压测很多团队做性能测试时HTTP 接口压得风生水起一到消息队列就抓瞎。尤其是还在用 JMeter 3.3 这类老版本工具的环境插件市场里 AMQP 支持要么版本对不上要么依赖冲突直接让 GUI 启动报错。我见过一个真实场景某公司订单系统用 RabbitMQ 做异步削峰上线前只压了 HTTP 下单接口结果大促当晚消息积压几十万条消费者根本追不上生产速度。事后复盘发现压测根本没覆盖消息生产与消费链路。JMeter 3.3 虽然老但存量环境里用得极广给它追加 RabbitMQ 压测能力核心就是解决“生产者能发多快、消费者能扛多少、队列积压到什么程度会崩”这三个问题。适合谁手里有 JMeter 3.3 不想升级、又要对 RabbitMQ 做端到端压测的测试与运维人员。下面把我踩过的路拆开讲。2. 给 JMeter 3.3 装上 AMQP 插件选型与最小可用配置2.1 为什么选 AMQP 插件而不是自己写 Java 请求JMeter 3.3 原生不支持 AMQP 协议常见做法有三种用 JSR223 Sampler 手写 Java 客户端、用第三方 AMQP 插件、或者用 HTTP 管理接口间接压。手写 Java 客户端最灵活但每个线程都要维护 Connection 和 ChannelJMeter 线程模型下极易出现连接泄漏压测还没跑完 Broker 就先被连接数打满。HTTP 管理接口只能压发布消费端没法模拟。第三方 AMQP 插件把 Connection 生命周期交给 JMeter 的线程组管理Sampler 层面只关心 exchange、routing key 和消息体对 3.3 这种老版本兼容性最好。我一般会选 AMQP 插件方案因为它把“连接管理”和“消息收发”解耦了调参时不用改代码。2.2 插件安装与依赖冲突排查JMeter 3.3 的插件管理器和现在新版不一样很多插件仓库地址已经失效。稳妥做法是手动把插件 jar 包丢进lib/ext目录。需要两个核心包AMQP 插件本体和 RabbitMQ Java 客户端。注意版本匹配RabbitMQ 客户端 4.x 系列对 Java 8 友好5.x 开始要求 Java 11JMeter 3.3 默认跑在 Java 8 上所以客户端版本别超过 4.12.0。# 进入 JMeter 3.3 安装目录 cd /opt/apache-jmeter-3.3 # 查看当前 lib/ext 下已有的 jar避免重复 ls lib/ext | grep -i amqp ls lib/ext | grep -i rabbit # 将下载好的插件包放入 lib/ext # 假设文件为 jmeter-amqp-plugin.jar 和 amqp-client-4.12.0.jar cp ~/downloads/jmeter-amqp-plugin.jar lib/ext/ cp ~/downloads/amqp-client-4.12.0.jar lib/ext/ # 同时确认 lib 目录下有 slf4j-apiRabbitMQ 客户端依赖它 ls lib | grep slf4j逻辑说明JMeter 启动时会扫描lib/ext下的 jar 并加载其中实现了 JMeter 接口的类。AMQP 插件包提供 Sampler 和配置元件RabbitMQ 客户端包提供底层通信能力。slf4j-api如果缺失启动日志会报NoClassDefFoundError但 GUI 可能仍能打开直到你添加 AMQP Sampler 才崩溃。参数上客户端版本选 4.12.0 是经过验证的稳定组合再高容易触发UnsupportedClassVersionError。2.3 用 GUI 搭出第一个 RabbitMQ 压测计划安装完重启 JMeter右键测试计划 - 添加 - Sampler应该能看到AMQP Publisher和AMQP Consumer。先别急着压用单线程跑通一条消息。!-- 这不是要你手写 XML而是展示线程组下各元件的层级关系 -- Test Plan Thread Group (线程数 1, 循环 1) AMQP Publisher - Exchange: test.exchange - Routing Key: test.key - Queue: test.queue - Message: {orderId:1001,amount:99.5} View Results Tree在 AMQP Publisher 配置界面里几个关键字段这样填Exchange 填已存在的交换机名Routing Key 填绑定键Queue 填目标队列。如果 Exchange 为空消息会直接进 Queue 字段指定的队列。消息体支持固定文本或从 CSV 读取。先点运行去 RabbitMQ 管理后台看队列里有没有这条消息。这一步跑通说明插件和 Broker 连通了。参数上Virtual Host默认是/如果 Broker 配了自定义 vhost 必须改否则报NOT_ALLOWED。3. 生产者压测把消息发出去还要发得稳3.1 连接复用与 Channel 策略AMQP 插件默认每个线程独立创建 Connection线程数一高Broker 的file descriptors直接爆。我一般会在测试计划级别加一个AMQP Connection配置元件让所有线程共享一个 Connection每个线程再各自开 Channel。这样连接数等于线程组数Channel 数等于并发线程数Broker 压力小很多。// 这是插件内部 Connection 复用的逻辑示意不是让你改源码 // 配置元件里勾选 Use shared connection // 每个线程从连接池取 Channel用完归还 Connection sharedConn factory.newConnection(); // 线程内 Channel ch sharedConn.createChannel(); ch.basicPublish(exchange, routingKey, props, body); // 不关闭 Channel由 JMeter 线程结束时统一回收逻辑说明RabbitMQ 的 Connection 是 TCP 级别创建成本高Channel 是逻辑通道创建成本低。共享 Connection 后压测并发能力取决于 Channel 数量而非 TCP 连接数。参数上Use shared connection勾选后Connection timeout建议设 5000msNetwork recovery interval设 10000ms避免网络抖动导致压测中断。3.2 消息体参数化与吞吐量控制压测不能只发一条固定消息要用 CSV Data Set Config 做参数化。准备一个orders.csv每行一条订单 JSONSampler 里用${orderJson}引用。orderJson {orderId:1001,amount:99.5,ts:1700000001} {orderId:1002,amount:12.0,ts:1700000002} {orderId:1003,amount:45.8,ts:1700000003}CSV 文件放测试计划同目录Filename 填orders.csvVariable Names 填orderJsonDelimiter 用默认逗号。如果 JSON 里本身有逗号Delimiter 改成|并在 CSV 里对应调整。吞吐量控制靠线程组的Constant Throughput Timer目标设成你预估的峰值 TPS 的 1.2 倍观察 Broker 的publish rate和confirm rate。如果开了 Publisher Confirms吞吐会下降 30% 左右这是正常的因为每条消息要等 Broker 确认。3.3 用聚合报告判断生产者瓶颈跑完压测看聚合报告重点看三个指标Throughput、Average、Error%。如果 Throughput 上不去但 CPU 不高多半是 Channel 不够或 Broker 磁盘 IO 到顶。如果 Error% 超过 1%去 JMeter 日志里搜channel error或connection reset。我遇到过一种情况压测机本地端口耗尽报Cannot assign requested address解决方法是调大net.ipv4.ip_local_port_range并缩短TCP TIME_WAIT。参数上生产者压测线程数从 50 起步每轮加 50直到 Throughput 不再线性增长那个拐点就是当前 Broker 配置下的生产上限。4. 消费者压测模拟真实消费速度别只看生产4.1 消费者 Sampler 的预取与确认模式只压生产不压消费等于只测了一半。AMQP Consumer Sampler 可以模拟消费者拉取消息。关键参数是Prefetch Count默认 0 表示不限消费者会一次性把队列里所有消息拉到本地内存直接爆。我一般设 50 到 200 之间根据消息大小调整。确认模式选autoAck还是manualAck要看业务autoAck 吞吐高但丢消息风险大manualAck 更真实但压测时要注意在 Sampler 里显式确认。!-- 消费者配置元件关键字段 -- AMQP Consumer queuetest.queue/queue prefetchCount100/prefetchCount autoAckfalse/autoAck timeout10000/timeout /AMQP Consumer逻辑说明prefetchCount控制 Broker 一次性推给消费者的未确认消息数。设太小消费者频繁往返拉取吞吐低设太大消费者内存压力大且故障时消息重投耗时长。autoAckfalse时Sampler 收到消息后需要调用basicAck插件通常提供勾选项自动确认压测场景下建议勾上否则消息会一直处于 unacked 状态队列看起来没积压但实际消费停滞。4.2 消费速率与队列积压的联动观察消费者压测要和生产者压测配合看。先启动生产者线程组再启动消费者线程组观察 RabbitMQ 管理页面的Ready和Unacked消息数。如果 Ready 持续上涨说明消费速度跟不上生产速度系统有积压风险。如果 Unacked 很高但 Ready 很低说明消费者拉走了消息但确认太慢可能是业务处理逻辑耗时。参数上消费者线程数不是越多越好超过 Broker 的consumer capacity后增加线程只会让 Unacked 堆积。我一般从 10 个消费者线程开始每轮加 10直到 Ready 数稳定在低位。4.3 用断言校验消息内容与顺序压测不只是看吞吐还要看消息有没有丢、有没有乱序。在 AMQP Consumer 下加一个 JSON 断言校验orderId字段存在且格式正确。顺序校验比较麻烦RabbitMQ 单队列单消费者能保证 FIFO多消费者就不保证。如果业务要求顺序压测时消费者线程数必须设为 1否则测出来的乱序是预期行为不是 Bug。// JSON 断言表达式示例 // 在 JMeter 的 JSON Assertion 里填 $.orderId // 勾选 Match as regular expression填 [0-9]{4} // 如果 orderId 不是 4 位数字断言失败逻辑说明断言失败的消息会标记为错误聚合报告里 Error% 上升。压测时如果 Error% 突然飙升先检查断言是不是写得太严比如把时间戳格式写死。参数上断言响应时间设 0 表示不限制但建议设一个合理上限比如 500ms超过说明消费处理有性能问题。5. 避坑与排查那些让压测结果失真的细节5.1 现象压测跑一半 JMeter 卡死日志报 OutOfMemoryError原因消费者 Prefetch Count 设太大或者生产者消息体太大且线程数过高JMeter 堆内存被消息对象占满。解决调小 Prefetch 到 50消息体超过 1MB 时降低线程数同时改 JMeter 启动脚本的HEAP参数-Xms2g -Xmx4g起步。5.2 现象Broker 管理页面显示连接数暴涨但吞吐没提升原因没勾选共享 Connection每个线程独立建连Broker 的file descriptors被占满新连接被拒绝。解决在测试计划级别加 AMQP Connection 配置元件勾选共享线程数控制在 Broker 的max_connections的 80% 以内。5.3 现象生产者 Throughput 很高但消费者一条都收不到原因Exchange 类型不匹配。生产者发到direct交换机但 Routing Key 和队列绑定键不一致消息被丢弃。解决去管理页面看 Exchange 的绑定关系或者临时把 Exchange 留空直接发到队列确认链路通不通。5.4 现象压测结果波动极大同一配置两次跑差一倍原因压测机和 Broker 不在同一网段网络抖动影响或者 Broker 磁盘 IO 被其他进程抢占。解决压测机尽量和 Broker 同机房压测前用iostat看磁盘%util超过 70% 就先别压数据不可信。5.5 现象手动确认模式下消息重复消费原因消费者处理完消息但确认前线程被 JMeter 强制停止Broker 没收到 Ack消息重新入队。解决压测时用自动确认或者在线程组里加tearDown逻辑等所有确认完成再停。这个坑很隐蔽压测报告里看不出但业务侧会看到重复订单。6. 进阶用变量与定时器模拟真实业务节奏前面跑通的是恒定压力真实业务往往有波峰波谷。我一般用Ultimate Thread Group插件配合 AMQP Sampler模拟“早高峰消息量翻三倍、午间回落、晚高峰再冲高”的节奏。具体做法在线程组里定义多个阶段每个阶段设不同的线程数和持续时间再叠加一个Random Variable配置元件让消息体里的amount在 10 到 500 之间随机这样消费者侧的处理耗时也会有波动更接近真实。验证压测是否有效我习惯看三个数生产 TPS、消费 TPS、队列积压峰值。如果生产 TPS 和消费 TPS 在压测结束后 30 秒内能回到 0且积压峰值没超过队列的max-length的 60%说明当前配置有安全余量。如果积压峰值贴着上限那大促时稍微一抖就触发死信队列。还有一个技巧在 AMQP Publisher 里加一个JSR223 PostProcessor把每次发送的时间戳和消息 ID 写到本地文件压测结束后用脚本比对消费者落库的数据能精确算出丢失率和重复率。这个后悔药我每次做消息队列压测都会备一份因为聚合报告只能告诉你“发了多少”不能告诉你“业务侧真正收到了多少”。最后说个血泪教训JMeter 3.3 的 AMQP 插件在高并发下偶尔会漏掉basicAck导致消息在 Unacked 状态卡住。我的习惯是压测结束后手动去管理页面清一次 Unacked再跑下一轮否则上一轮的残留会影响下一轮的数据。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑