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

Gatling Websocket压测异常排查:消息存储与发送失败问题

问题分析与修复方案

1. session.get("message")返回空值的原因

你使用的正则regex(".*?")是惰性非贪婪匹配,它会匹配到空字符串就停止,导致saveAs("message")实际保存的是空内容。

修复方法

将正则改为贪婪匹配的regex(".*"),或者更精准地匹配服务器返回的有效提示内容(跳过HTML格式,捕获核心文本):

.check(regex("Which mode would you like to play?[\\s\\S]*").saveAs("message"))

[\\s\\S]*会匹配所有换行和非换行字符,确保捕获完整的提示文本。

2. 服务器未收到"2"的原因

从握手日志可以看到,Gatling默认启用了permessage-deflate压缩扩展:

Sec-WebSocket-Extensions: permessage-deflate; client_no_context_takeover; server_max_window_bits=12; client_max_window_bits=12

你的Python websockets服务器对该压缩扩展的处理存在兼容性问题,导致发送的压缩消息无法被服务器正确解析,因此服务器看似未收到消息。

修复方法

在HttpProtocolBuilder中禁用WebSocket压缩扩展:

HttpProtocolBuilder httpProtocol = http
        .wsBaseUrl("ws://localhost:5000")
        .wsDisableExtension("permessage-deflate"); // 禁用压缩扩展

完整修复后的仿真代码

package computerdatabase;

import static io.gatling.javaapi.core.CoreDsl.*;
import static io.gatling.javaapi.http.HttpDsl.*;

import io.gatling.javaapi.core.*;
import io.gatling.javaapi.http.*;

public class WebsocketSimulation extends Simulation {

    HttpProtocolBuilder httpProtocol = http
            .wsBaseUrl("ws://localhost:5000")
            .wsDisableExtension("permessage-deflate");


    ScenarioBuilder scene = scenario("Websocket")
            .exec(ws("connect")
                    .connect("")
                    .await(30).on(ws.checkTextMessage("checkMessage")
                            .check(regex("Which mode would you like to play?[\\s\\S]*").saveAs("message")))
                    )
            .exec(session -> {
                System.out.println("response: " + session.get("message"));
                return session;
            })
            .exec(ws("sendMessage").sendText("2"))
            .pause(30)
            .exec(ws("Close WS").close());


    {
        setUp(scene.injectOpen(
                        atOnceUsers(1))
                .protocols(httpProtocol));
    }
}

验证说明

  • 修复正则后,session.get("message")会正确捕获服务器返回的完整提示文本;
  • 禁用压缩后,Gatling发送的纯文本消息会被服务器正常接收解析,与JS客户端/Postman的行为一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:40:19