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();
    }
}

开始测试

第一次测试
测试环境

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. 本次测试仅仅是测试连接数,连接没有加入负载代码,数据仅做参考,不能应用到实际项目中。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Zuul中使用WebSocketSockJS,您需要进行以下配置: 1. 添加依赖项 ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul-websocket</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. 配置Zuul路由 ```yml zuul: routes: websocket: path: /websocket/** url: ws://localhost:8081 ``` 这将把所有以“/websocket”开头的请求路由到WebSocket服务器上。 3. 配置SockJS ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/websocket").setAllowedOrigins("*").withSockJS(); } } ``` 这将配置一个SockJS端点,它将处理所有以“/websocket”开头的请求,并使用简单的代理模式将消息转发到“/topic”目的地。 4. 启用Zuul ```java @SpringBootApplication @EnableZuulProxy public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这将启用Zuul代理,并将它们路由到相应的WebSocket服务器和SockJS端点。 现在,您应该可以在Zuul中使用WebSocketSockJS了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值