Gatling循环内使用pause执行频率不符合预期如何解决
问题核心成因
- 你配置的bzt参数
throughput: 1会强制限制全局请求频率为每秒1次,该规则的优先级高于Gatling原生的pause配置,直接导致你代码中写的10秒等待逻辑被运行器覆盖,这是最核心的原因。 - Gatling原生
pause方法的语义是「上一个操作执行完成后,等待固定时长再执行后续操作」,实际循环间隔会叠加请求本身的执行耗时,不符合轮询场景下固定间隔发起请求的需求。
正确实现方式
第一步:调整bzt配置
删除配置中的throughput: 1参数,放开运行器侧的强制吞吐量限制,让Gatling自身的间隔控制逻辑生效,调整后的配置如下:
hold-for: 30s concurrency: 1 iterations: 1
第二步:替换pause为pace实现固定间隔轮询
pace方法的语义是「固定两次循环起始点的间隔时长」,不管单次循环内的请求执行耗时多久,都会严格保证每隔指定时长发起一次轮询,匹配你预期的轮询逻辑,调整后的核心代码如下:
private val scn = scenario("Post, Poll, and Delete") .forever { exec(http("Post").post(url + path) .check(status.is(201)) .check(jsonPath("$..id").saveAs("id")) // 初始化status为STARTED,避免第一次doWhile判断报错 .exec(session => session.set("status", "STARTED")) ) .doWhile(session => session("status").as[String] == "STARTED", "index") { pace(10.seconds) .exec(http("Poll") .get(url + path) .queryParam(id, session => session("id").as[String]) .check(jsonPath("$..status").saveAs("status")) .check(jsonPath("$..status").not("ERROR")) ) }.exec(http("Delete") .delete(url + path) .check(status.is(200)) ) }
内容的提问来源于stack exchange,提问作者Seth
相关产品推荐
相关产品推荐

