Spring WebSocket+SockJS+Stomp 最大连接数测试

测试目的
测试默认配置下的Spring WebSocket+SockJS+Stomp 最大连接数

服务器环境
系统:win10 
内存:8G 
运行环境:spring-boot-starter-undertow,以Spring jar包造型运行 
服务器搭建参考《Spring Boot 的 WebSocket 开发说明文档》 
服务器没有进行调优,使用的是SpringBoot默认配置。

测试环境
使用纯java代码测试

//连接数
public static int connectNum = 0;
//连接成功数
public static int successNum = 0;
//连接失败数
public static int errorNum = 0;

/**
 * 测试websocket最大连接数
 * @throws InterruptedException
 */
@Test
public void testConnect() throws InterruptedException {
    new Thread() {
        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //每次3秒打印一次连接结果
                System.out.println(                       DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss:sss") +
                        "  连接数:" + connectNum
                        + "  成功数:" + successNum
                        + "  失败数:" + errorNum);
            }
        }
    }.start();
    List<WebSocketStompClient> list = new ArrayList<>();
    System.out.println("开始时间:"
            + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss:sss"));
    while (true) {
        //连接失败超过10次,停止测试
        if(errorNum > 10){
            break;
        }
        list.add(newConnect(++connectNum));
        Thread.sleep(10);
    }
}

/**
 * 创建websocket连接
 * @param i
 * @return
 */
private WebSocketStompClient newConnect(int i) {
    List<Transport> transports = new ArrayList<>();
    transports.add(new WebSocketTransport(new StandardWebSocketClient()));
    WebSocketClient socketClient = new SockJsClient(transports);
    WebSocketStompClient stompClient = new WebSocketStompClient(socketClient);

    stompClient.setMessageConverter(new MappingJackson2MessageConverter());
    ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
    taskScheduler.afterPropertiesSet();
    stompClient.setTaskScheduler(taskScheduler);

    String url = "ws://localhost:8088/websocket?token=" + i;
    stompClient.connect(url, new TestConnectHandler());
    return stompClient;
}

private static synchronized void addSuccessNum() {
    successNum++;
}

private static synchronized void addErrorNum() {
    errorNum++;
}

private static class TestConnectHandler extends StompSessionHandlerAdapter {
    @Override
    public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
        addSuccessNum();
    }

    @Override
    public void handleTransportError(StompSession session, Throwable exception) {
        addErrorNum();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
开始测试
第一次测试
测试环境
win10 一台 
网络:本地网络 localhost 
测试方式:直接跑上面的java代码 
测试时长:2018-03-09 10:16:18 ~ 2018-03-09 10:26:42 共 10分24秒 
测试结果: 
测试机的开始测试的时间图 


测试机达到连接上限的结束测试图 


服务器的当时的连接数图 


最终当测试机器的连接数达到16343时,出现异常,无法再添加连接了。

第二次测试
测试环境同第一次
win10 一台 
网络:本地网络 localhost 
测试方式:直接跑上面的java代码 
测试时长:2018-03-09 10:29:23 ~ 2018-03-09 10:39:41 共 10分18秒 
测试结果: 
测试机的开始测试的时间图 


测试机达到连接上限的结束测试图 


服务器的当时的连接数图 


最终当测试机器的连接数达到16284时,出现异常,无法再添加连接了。

第三次测试
测试环境
win10 三台,macOS10.11.6 一台 
网络:局域网 
测试方式:每台测试机跑上面java代码,然后限制跑10000个连接数 
测试时长:2018-03-09 13:02:26 ~ 2018-03-09 14:18:00:41 共 1小时16分15秒 
测试结果: 
测试机忘记截图了 
服务器的连接数图 


一开始是用三台win10测试的,当三台机子跑满10000个连接时服务器还是没有出来异常,所以又加了一台macOS机子进来,最终当服务器的连接数达到37001时,macOS出现了异常,又没找到更多机子测试,最终终止了本次测试。

测试结论
前两次测试是在本地测试的(服务器和测试在同一台机子上),当连接数到1万6的时候测试端就出现了异常,看异常是已经达到了最大连接数了,服务器的连接并未到达上限,测试出现了瓶颈。所以第三次测试又找来了几台机子一起测,一开始是用三台win10测试,每台跑10K个连接,当三台机器跑满10K时,测试端和服务器端都没有出现异常,所以又找到了一台macOS苹果机加入测试,当macOS端跑到7K时出现了连接数最大限制异常,无法再新增连接了,最后由于没有新机子测试,就终止了测试。

最终结论是 
1. win10下客户端WebSocketStompClient的最大连接数是16K+,macOS下客户端WebSocketStompClient的最大连接数是7K。 
2. 由于测试条件不成熟,没用专业的测试工具,没能测出服务器端的最大连接数,估计不少于40K。 
3. 本次测试仅仅是测试连接数,连接没有加入负载代码,数据仅做参考,不能应用到实际项目中。
--------------------- 
作者:lnktoking 
来源:CSDN 
原文:https://blog.csdn.net/lnkToKing/article/details/79493498 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值