javascript浏览器端无法模拟万级websocket并发,因受限于单域名6连接硬限制及内存瓶颈;node.js+ws库才是万级压测主力,需节流建连、绑定全生命周期事件、主动心跳,并协同验证连接洪峰、长连接驻留、消息广播与异常治理四环节。

JavaScript 本身不能直接在浏览器里模拟万级 WebSocket 并发连接——这是由浏览器沙箱机制和系统资源限制决定的硬边界。真要测万级长连接表现,得跳出“纯前端脚本”思路,分场景、分角色、分工具来落地。
浏览器端:最多几十个,只适合验证握手与基础行为
Chrome 默认单域名最多 6 个并发 WebSocket 连接(可改 chrome://flags/#max-connections-per-host,但不推荐),Firefox 更严。即使强行调高,200+ 连接就会触发内存溢出或页面卡死。它适合做轻量验证:
- 检查服务端握手是否返回 101,是否拒绝非法 Origin 或未带 Upgrade 头
- 观察 onerror 是否高频触发(比如证书错误、CORS 拒绝、Nginx 未透传 Connection 头)
- 确认心跳帧(Ping/Pong)能否被正确响应,避免服务端静默断连
Node.js 端:真正能跑万级连接的主力环境
用 Node.js + ws 库(不是 websocket)是目前最可控、最贴近真实客户端的压测方式。关键不在“建多少”,而在“建得稳、活得久、收得准”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 必须用
ws库:支持rejectUnauthorized: false绕过自签名证书,且错误处理更细粒度 - 连接要节流:不要 for 循环一把梭,用
setImmediate()或Promise.resolve().then()分散调度,每 50 个连接加await new Promise(r => setTimeout(r, 10)),防 SYN 风暴被防火墙拦截 - 每个连接必须绑定完整生命周期事件:
onopen、onmessage、onerror、onclose,漏掉onerror就等于“盲建”,失败连接无声消失 - 心跳要主动发:服务端若不自动 Ping,客户端需定时
ws.ping();同时设ws.on('pong', ...)响应,防止因网络抖动被误判断连
全链路协同:光连上不够,得测住、测通、测稳
万级连接压测不是比谁连得多,而是看整个链路是否扛得住四个关键环节:
-
连接洪峰:1 万连接在 30 秒内建立,考验服务端 accept 队列、SSL 握手性能、Nginx 的
worker_connections和proxy_buffering off配置 - 长连接驻留:连接建好后维持 10 分钟以上,观察服务端内存增长趋势——若每连接吃 64KB(如 Python websockets 默认压缩开启),1 万连接就占 640MB,极易 OOM
- 消息广播压力:一条群聊消息推给 1 万人,等于 1 万次独立 socket 写操作,触发网络 I/O 放大。此时要看服务端广播逻辑是否异步非阻塞,有没有用 epoll/kqueue 批量刷写
- 异常连接治理:模拟随机断连、网络闪断、心跳超时,验证服务端能否快速回收 fd、清理会话状态、不堆积 TIME_WAIT
避坑重点:90% 的“连不上”“end of stream”都出在这几处
实测中高频报错往往和底层配置强相关,不是代码问题:
- 客户端机器
ulimit -n没调,卡死在 1024 —— 每个 WebSocket 占一个文件描述符 - 服务端
net.core.somaxconn过小,listen 队列满,新连接直接被丢弃 - Nginx 缺少三行关键配置:
proxy_http_version 1.1、proxy_set_header Upgrade $http_upgrade、proxy_set_header Connection "upgrade" - JMeter 测 WebSocket 用了 HTTP 采样器,只发了 Upgrade 请求就以为连上了,实际后续没发 Ping,3 秒后被服务端踢掉
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










