You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
)

四、关键修改点说明

  1. 动态生成Stream名称:

    • 使用UUID.randomUUID().toString.replace("-", "")生成无连字符的唯一字符串,确保每次请求的stream名称完全唯一,彻底解决"already exists"报错;
    • 替代原代码中在Scenario定义阶段生成的固定随机字符串,避免复用冲突。
  2. 调整负载注入逻辑:

    • 用rampUsers(10) during (10 seconds)实现10秒内扩容;
    • 用constantUsersPerSec(10) during (30 minutes)维持稳定负载;
    • 用rampUsers(0) during (10 seconds)实现平滑缩容;
    • 总测试时长设置为30.minutes + 20.seconds,覆盖全流程。
  3. 其他注意事项:

    • 若Server Stream请求需要主动关闭,可在请求后添加.end()或对应关闭逻辑,避免资源泄漏;
    • 若grpcConf.shareChannel引发其他异常,可尝试关闭通道共享(不推荐,会增加资源消耗)。

内容的提问来源于stack exchange,提问作者VinGt22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:20:29