【JMeter Retrier 插件:让失败请求自动重试,告别脚本繁琐循环】

JMeter Retrier 插件:让失败请求自动重试,告别脚本繁琐循环

解决 JMeter 原生不支持重试的痛点,一行配置轻松实现智能重试

一、为什么需要重试插件?

在用 JMeter 做接口测试或性能压测时,经常会遇到因网络抖动、服务限流(HTTP 429)、临时错误等导致的请求失败。JMeter 本身没有提供失败重试机制,要么忽略错误继续执行,要么直接停止线程,很难优雅地处理这种"可恢复"的异常。

虽然可以通过 While Controller + 变量手动实现重试逻辑,但配置繁琐,尤其当业务流程中有多个需要重试的步骤时,脚本会变得复杂难维护。

JMeter Retrier 插件应运而生 ------ 只需添加一个后置处理器,就能让任意取样器具备智能重试能力。

二、插件简介

  • 项目地址tilln/jmeter-retrier
  • 最新版本:1.0(2022-05-27)
  • JMeter 要求:5.0 及以上
  • 核心功能:对失败的取样器自动重试,支持多种退避策略、条件匹配、Retry-After 响应头等

三、安装方法

通过 Plugins Manager 安装

  1. 确保你已经安装了 JMeter Plugins Manager(将 plugins-manager.jar 放入 lib/ext 并重启 JMeter)。
  2. 打开 JMeter,点击菜单栏 OptionsPlugins Manager
  3. 切换到 Available Plugins 选项卡,在搜索框输入 Sample Retrier
  4. 勾选插件,点击右下角 Apply Changes and Restart JMeter 完成安装。
    (实际界面中搜索 "Sample Retrier" 即可)

验证安装成功 :在测试计划中添加取样器(如 HTTP 请求),右键 添加 → 后置处理器,能看到 Retry Post-Processor 即表示成功。

四、基础使用教程

4.1 快速上手:让 HTTP 请求失败后重试 3 次

  1. 创建测试计划 :添加 线程组 → 添加 HTTP 请求(比如请求一个可能返回 429 的接口)。
  2. 添加重试处理器 :右键点击该 HTTP 请求 → 添加后置处理器Retry Post-Processor
  3. 配置关键参数
参数 说明
Max Number of Retries 3 最多重试 3 次
Response Part None 默认只要请求失败(响应码非 2xx/3xx)就重试
Pause (milliseconds) 1000 每次重试前等待 1 秒
Backoff None 固定延迟,不递增

配置界面如下图所示:

运行后,如果原始请求失败,你会看到 子结果 中依次出现 xxx-retry 1xxx-retry 2... 直到成功或达到最大重试次数。

重试条件(Response Part)

None:只要请求失败(超时、连接异常、任何非 2xx)就重试

Response code:按状态码重试

Data:响应内容包含错误文本(如 "服务不可用")

Headers:响应头包含错误信息

Message:响应消息(如 "Internal Server Error")

4.2 进阶配置:条件重试 + 智能延迟

重试条件(Response Part)

None:只要请求失败(超时、连接异常、任何非 2xx)就重试

Response code:按状态码重试

Response Data:响应内容包含错误文本(如 "服务不可用")

Response Headers:响应头包含错误信息

Response Message:响应消息(如 "Internal Server Error")

示例选择根据响应内容(Response Data)判断是否重试

有时请求成功(HTTP 200)但业务返回错误码(如 {"code":500}),此时需要重试。

  • Response Part:选择 Response Data
  • Error Pattern:填入 "code":500(正则表达式)

这样,只有当响应数据中包含 "code":500 时才会触发重试。

使用退避策略避免加重服务器压力(Backoff)
Backoff 策略 延迟计算公式(Pause=100ms) 适用场景
None 100, 100, 100... 快速重试,对服务器影响小
Linear 100, 200, 300... 逐步退让,缓解瞬时压力
Polynomial 100, 400, 900... 快速降低重试频率
Exponential 100, 200, 400, 800... 经典退避,适合限流场景

可通过 JMeter 属性 jmeter.retrier.backoffMultiplier 调整指数/多项式的底数(默认 2)。

配合 Jitter 避免惊群效应

设置 Jitter Factor = 0.1,会在计算出的延迟上增加 ±10% 的随机波动,防止多个线程同时重试造成二次拥堵。

尊重服务端返回的 Retry-After

勾选 Respect "Retry-After" 后,如果服务器响应头包含 Retry-After: 10(单位秒),插件会等待 10 秒后再重试(若同时设置了 Pause,则取两者较大值)。

五、结果如何呈现?

  • 原始失败请求和每一次重试都会作为 子结果 显示,标签格式为 原标签-retry N
  • 最终的主结果(原标签-retry)包含最后一次尝试的请求/响应数据、所有尝试的总字节数、总响应时间(不含暂停)。

这样既能看到每次重试的细节,也能用最终结果做断言,非常方便。

六、⚠️ 重要限制(务必了解)

由于 JMeter 线程执行机制的限制,使用本插件时请注意:

  1. 预处理器(Pre-Processors)、定时器(Timers)只会在首次尝试前执行一次,不会在每次重试前重新执行。
  2. 断言(Assertions)和其他后置处理器(Post-Processors)只会在最终尝试后执行一次,不会对每次重试分别断言。
  3. 连接时间、延迟时间、空闲时间不会累积,主结果中仅包含最后一次尝试的耗时(总响应时间是累加值)。

这意味着:如果你的请求依赖动态参数(如每次重试前需要重新获取 token),则需要手动处理(比如将获取 token 的取样器放在循环外部,或者使用 While Controller 自己实现重试)。

七、常见问题 FAQ

Q1:能和其他后置处理器(如 JSON Extractor)一起用吗?

A:可以,但请注意顺序。放在 Retry Post-Processor 之前 的后置处理器会在重试前执行(仅一次),放在之后的会在重试结束后执行(仅一次)。如果想每次重试都提取变量,不适用。

Q2:能重试 JDBC Request 或 JSR223 Sampler 吗?

A:可以,只要是 JMeter 取样器,且能通过 Result status(成功/失败)或响应内容判断是否需要重试即可。

Q3:如何修改重试子结果的标签后缀?

A:设置 JMeter 属性 jmeter.retrier.sampleLabelSuffix,例如 -retryAgain,默认为 -retry

Q4:无限重试会不会导致死循环?

A:将 Max Number of Retries 设为负数即可无限重试,但建议配合 Pause 和退避策略,并确保有成功退出条件,否则会一直运行。

八、总结

优点 缺点/限制
✅ 配置简单,无需编程 ❌ 预处理器/定时器等不会在重试时重新执行
✅ 支持多种退避策略和 Jitter ❌ 断言仅对最终结果生效
✅ 可基于响应内容/状态码灵活匹配 ❌ 项目已两年未更新(但功能稳定)
✅ 结果清晰,子结果详细 ❌ 仅支持 JMeter 5.0+

如果你的 JMeter 脚本经常因为临时性故障而失败,JMeter Retrier 绝对是你的救星。它大幅降低了实现重试逻辑的复杂度,让脚本更加简洁可靠。

赶快试试吧!安装 Plugins Manager 后搜索 Sample Retrier 即可一键安装。

欢迎在评论区留言讨论使用心得或踩坑经验。如果觉得文章对你有帮助,请点赞收藏支持一下~

相关推荐
沫沫-小白4 小时前
【JMeter 实战:大模型流式接口性能测试(含TTFT与Token统计)】
jmeter
测试改改4 小时前
Jmeter-上传图片(一直报500的错误)
jmeter
brucelee18621 小时前
使用 JMeter 进行 API 压力测试完整指南
jmeter·压力测试
Echoo华地1 天前
Gatling压测案例
java·jmeter·压力测试·并发·scale·压测·gatling
chenjingming6662 天前
jmeter处理接口返回中文乱码的问题
jmeter
chenjingming6662 天前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
洛_尘2 天前
测试9:性能测试--工具篇(JMeter)
jmeter
夜晚打字声2 天前
7(七)Jmeter吞吐量设置
jmeter