K6 WebSocket性能测试:如何解码服务器返回的压缩文本?
在K6中解码WebSocket压缩消息的解决方案
你遇到的问题本质是K6的WebSocket客户端不会自动处理服务器返回的压缩消息,而Node.js的WebSocket库默认支持了per-message压缩的自动解析,所以能拿到正确文本。下面是具体的解决步骤和代码修改方案:
核心原因
服务器返回的是经过gzip/deflate压缩的二进制数据,K6直接打印二进制数据就会出现乱码;而Node.js的ws等客户端库默认开启了压缩消息的自动解压逻辑,因此能正常解析出文本内容。
解决步骤
K6内置了k6/compress模块,可直接用来解压gzip或deflate格式的数据,你只需要在消息处理逻辑中添加解压步骤即可:
1. 导入压缩模块
在脚本顶部导入decompress方法:
import { decompress } from 'k6/compress';
2. 修改消息处理逻辑
调整你现有的message事件回调,先尝试解压数据,再转换为可读字符串:
socket.on('message', function (data) { console.log(typeof(data)); console.log(data.length); try { // 将收到的二进制数据(ArrayBuffer/Uint8Array)解压 // 如果服务器用的是deflate,把第二个参数改成'deflate' const decompressedBuffer = decompress(data, 'gzip'); // 将解压后的二进制数据转成UTF-8字符串 const decodedText = new TextDecoder('utf-8').decode(decompressedBuffer); console.log('解码后的内容:', decodedText); } catch (error) { // 处理解压失败的情况(比如数据未压缩) console.log('未压缩或解压失败,原始内容:', new TextDecoder('utf-8').decode(data)); } });
额外注意事项
- 确认压缩格式:先确认服务器使用的是gzip还是deflate,大部分场景下是gzip,若为deflate,调整
decompress的第二个参数即可。 - 数据类型兼容:K6收到的
data可能是ArrayBuffer或Uint8Array,decompress方法都能处理,若遇到类型问题,可手动转换:new Uint8Array(data)。 - 压缩协商(可选):部分服务器需要客户端在握手时声明支持压缩,可在建立连接时添加请求头:
const socket = new WebSocket('ws://your-server-url', { headers: { 'Sec-WebSocket-Extensions': 'permessage-deflate' } });
这样修改后,就能正常解码服务器返回的压缩消息了。
内容的提问来源于stack exchange,提问作者wazhao




