在一个网站中,很多数据需要即时更新,比如期货交易类的用户资产。在以前,这种功能的实现一般使用http
轮询,即客户端用定时任务每隔一段时间向服务器发送查询请求来获取最新值。这种方式的弊端显而易见:
HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议-WebSocket
,很好地解决了http轮询的弊端。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
也就是说,http
轮询机制,主动权完全在客户端,而WebSocket机制中,主动权可以交给服务端,数据推送可以更精确,包括何时推送(定时推送还是更新即推送),推送什么数据。
JMeter可以非常便利地进行WebSocket
接口测试,但需要引入下列依赖:
相关依赖下载:
https://pan.baidu.com/s/1PTOyTBzmOwLPNhxB-TxR7g ,提取码:uq25
下面内容基于JMeter5.1.1
将相关jar包放入JMeter安装目录的/lib/etc中,重启JMeter。在取样器中,可以看到比之前多了websweocket
相关的取样器。
在编写脚本之前,先要搞清楚推送服务的逻辑,它的逻辑是这样的:
ping-pong
消息,维持心跳建立连接,使用【WebSocket request-response Sampler】,顾名思义,这个取样器既能发送请求也能接收响应。
说明一下各项内容:
Connection
:有use existing connection
和setup new connection
两种模式,前者是使用已有连接,即上一个websocket请求所建立的连接通道,选择后Server URL
全置灰只读不可操作。后者指新建连接通道。Server URL
:ws协议和wss(加密的websocket)可选,sever name or IP
(服务器地址)、Port
(端口号)、Path
(路径)、Connection timeout
(连接超时时间)这些含义也很明了。Data
:发送数据,可以选择Text(文本,包括JSON)和Binary(二进制)形式,也可以通过勾选Read request data from file
来从文件中获取data。这个请求要与连接请求是同一个线程,并且要定时运行,因此设计脚本结构如下:
注意两点:
一般的websocket推送服务,会设计定时心跳检测机制,也就是客户端定时向服务端发送一条特定的消息,这样服务端就会保持这个连接,否则的话,这个客户端就被服务端判定为不活跃而被断掉连接。因此,为了让我们的脚本持续跑下去,就需要加入心跳检测请求。
因为线程循环次数是1次(多次的话,就是一个线程反复建立连接了),因此我们要把【心跳检测】放到一个循环控制器中。
而【固定定时器】的作用,就是控制【心跳检测】发送的频率:
心跳检测:
尤其要注意两点:
Connection
项一定要选择 use existing connection
,表示使用该线程已经建立的连接,否则就重新创建连接了。Request data
根据服务端的实现而定。