Gatling gRPC负载脚本单用户多服务流创建及测试报错问题
解决方案
一、修复Server Stream名称重复报错
报错根源是stream名称在Scenario定义阶段就固定生成,同一个用户多次请求或多用户复用同一Scenario时,会重复使用相同的stream名称,导致创建冲突。需改为每次请求时动态生成唯一名称。
二、调整负载注入策略实现目标场景
原注入逻辑不符合需求,需调整为:
- 10秒内逐步扩容至10用户
- 维持10用户运行30分钟
- 最后10秒逐步缩容至0用户
三、完整修改后代码
import io.gatling.core.Predef._ import io.gatling.grpc.Predef._ import scala.concurrent.duration._ import java.util.UUID // 修复Server Stream场景:每次请求动态生成唯一stream名称 val appServerStreamScenario: ScenarioBuilder = scenario("app Server Streaming Flow") .exec( grpc("app_ExecuteCommand_Request") .serverStream( AppMessageRouterGrpc.METHOD_EXECUTE_COMMAND, // 每次请求生成唯一UUID作为stream名称后缀,避免重复 "appServerStreamReplier_" + UUID.randomUUID().toString.replace("-", "") ) .start(AppMsg(ByteString.EMPTY, Map("commandname"->"printdata"))) .endCheck(statusCode is Status.Code.OK) ) val session_server_Scenarios = randomSwitch( 34.0 -> exec(appEchoRequest).pause(5), 33.0 -> exec(appExecuteTransactionRequest).pause(5), 33.0 -> exec(appServerStreamScenario).pause(5) ) val SessionServerTransactions = scenario("App_Scenarios") .during(30.minutes + 20.seconds, exitASAP = false) { // 总时长覆盖扩容+维持+缩容全周期 tryMax(repeats) { exec(session_server_Scenarios) }.exitHereIfFailed } // 调整注入策略实现目标负载场景 setUp( SessionServerTransactions.inject( rampUsers(10) during (10 seconds), // 10秒内扩容至10用户 constantUsersPerSec(10) during (30 minutes), // 维持10用户运行30分钟 rampUsers(0) during (10 seconds) // 10秒内缩容至0用户 ).protocols(grpcConf.shareChannel) )
四、关键修改点说明
动态生成Stream名称:
- 使用
UUID.randomUUID().toString.replace("-", "")生成无连字符的唯一字符串,确保每次请求的stream名称完全唯一,彻底解决"already exists"报错; - 替代原代码中在Scenario定义阶段生成的固定随机字符串,避免复用冲突。
- 使用
调整负载注入逻辑:
- 用
rampUsers(10) during (10 seconds)实现10秒内扩容; - 用
constantUsersPerSec(10) during (30 minutes)维持稳定负载; - 用
rampUsers(0) during (10 seconds)实现平滑缩容; - 总测试时长设置为
30.minutes + 20.seconds,覆盖全流程。
- 用
其他注意事项:
- 若Server Stream请求需要主动关闭,可在请求后添加
.end()或对应关闭逻辑,避免资源泄漏; - 若
grpcConf.shareChannel引发其他异常,可尝试关闭通道共享(不推荐,会增加资源消耗)。
- 若Server Stream请求需要主动关闭,可在请求后添加
内容的提问来源于stack exchange,提问作者VinGt22
相关产品推荐
相关产品推荐

