java socket 性能测试_websocket性能测试工具调研对比

此文已由作者侯本文授权网易云社区发布。

欢迎访问

一、工具选型

gatling

node.js

jmeter

java websocket

这些工具都是可以支持websocket协议的工具,主要从以下几个方面进行对比:工具使用的难易程度

测试工具的资源开销

和性能测试平台结合的难易程度

二、对比过程

对比场景5000个用户,每秒钟发送100个登录请求,并保持链接

5000个用户,每隔5s发送一条点对点消息,即发送消息频率为1000

工具使用过程

1. gatling

工具简介:Gatling是一款基于Scala 开发的高性能服务器性能测试工具,它主要用于对服务器进行负载测试,并分析和测量服务器的各种性能指标。

工具语言:Scala语言

相关代码:

val httpConf = http

.baseURL("http://host:port")

.wsBaseURL("ws://host:port")

val scn = scenario("WebSocket")

.exec(http("handshark").get("/socket.io/1/?t=System.currentTimeMillis()")

#因为服务端的协议特点,需要首先发送http请求,获取用户token,然后发送websocket协议

.check(regex("""(^.+):90:60:""").saveAs("token")))

#从请求返回的结果中提取出token

.pause(1)

.exec(ws("connect").open("/socket.io/1/websocket/${token}"))

#websocket connect请求,请求中需要token参数

.pause(1)

.exec(ws("auth")

.sendText("""3:::authInfos""")

#链接建立成功后,发送登录请求

.check(wsAwait.within(3 seconds).until(1).regex("200")))

#验证是否登录成功

.repeat(5){

exec(

ws("heartbeat")

.sendText("""2::""")

#需要自己管理心跳信息,每隔100s发送一次心跳信息

)

.pause(100)

}

.exec(ws("Close WS").close)

遇到的问题:scale语言比较陌生,脚本编写时困难较多。目前暂未实现间隔一定时间,即发心跳又发消息的场景。

无法和性能测试平台结合,不过gatling本身的界面化就比较漂亮

2. node.js + socketIO

工具简介:Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。

http://socket.io一个是基于Nodejs架构体系的,支持websocket的协议用于时时通信的一个软件包。http://socket.io 给跨浏览器构建实时应用提供了完整的封装,http://socket.io完全由javascript实现。

工具语言:JavaScript

工具官网:

相关代码:

var io = require('socket.io-client');

var clients = require("./clients.js");

var fs = require('fs');

init = function(host, port, uid, token){

var socket = io.connect(url,{path: '/socket.io/1/',transports: ['websocket']});

socket.on('connect', function(){

auth(this, uid, token);

});

socket.on('message', function(data){

});

socket.on('error', function(err){

console.log('error: ' + err);

});

};

var index = 0;

setInterval(function(){

if(index < size){

init(host, port, uid, token);

index++;

}

},authInterval);

function auth(socket, uid, token){

if(socket) {

var msg = '{"SID":2,"CID":3,"SER":11,"Q":[{"t":"property","v":{}}]}'

socket.send(msg);

}

}

遇到问题:如何进行分布式控制

如何和平台结合

3. jmeter

工具简介:

jmeter是比较常见的性能测试开源工具,支持多种协议,可以自定义java请求,比较灵活。

工具语言:java

jmeter xml脚本文件

工具官网:

相关代码:

遇到问题:jmeter的工具本上是同步的,如果建立1w个链接的话,需要启动1w个线程处理,不适合测试高链接的场景

4. jetty websocketClient

工具简介:

Jetty提供了功能更强的WebSocket API,使用一个公共的核心API供WebSockets的服务端和客户端使用。

工具语言:java

工具官网:

相关代码:

@OnWebSocketClose

public void onClose(int statusCode, String reason) {

System.out.printf("Connection closed: %d - %s%n", statusCode, reason);

this.session = null;

this.closeLatch.countDown();

}

@OnWebSocketConnect

public void onConnect(Session session) {

System.out.printf("Got connect!");

this.session = session;

String authInfo = "3:::authinfo";

try {

Future fut = session.getRemote().sendStringByFuture(authInfo);

fut.get(2, TimeUnit.SECONDS);

} catch (Throwable t) {

t.printStackTrace();

}

}

@OnWebSocketMessage

public void onMessage(String msg) {

System.out.printf("auth, 3-2");

}

遇到问题:需要自己写并发控制

三、对比结果总结

从选型上,最终比较倾向于gatling和socketIO

更多网易技术、产品、运营经验分享请点击。

你可能感兴趣的:(java,socket,性能测试)