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
相关产品推荐
相关产品推荐

