WebSocket
0、背景介绍
最新项目需要用到服务器数据更新时实时向客户端推送数据的功能,调研了WebSocket、SSE以及客户端轮询几种方式,下面是几种方式的简介及比较。
1、长/短轮询(客户端拉动)
顾名思义,轮询是每隔一段时间客户端主动去询问服务端。
1、1 长轮询
长轮询是客户端定时请求服务端,服务端收到请求后如果有数据,就立刻响应请求 ;如果没有数据,就会停留一段时间,这段时间内,如果数据到位(查库或者数据处理完成),就会立刻响应;如果这段时间过后,还没有数据到位,会返回一个空数据给就客户端;如果客户端收到空数据,会再次发送相同的请求的服务端。
缺点很明显:资源浪费,连接挂起需要耗费资源
1、2 短轮询
短轮询的话,客户端定时向服务端发送请求,服务端收到请求后立刻响应,然后这个连接就会被关闭。
缺点:资源浪费,每次链接都需要新建TCP连接,连接的建立是很耗费资源的
1、3 轮询的共性问题
- 耗费资源,不论是连接的频繁建立还是挂起,都会消耗资源
- 非实时,延迟取决于请求间隔
- 优点:简单实现、兼容性好(只要支持HTTP协议即可)
2、SSE(服务器推送)
SSE(Server-Sent Events)是HTML5提出的一个标准,是由客户端发起与服务端之间建立连接,然后维持这个连接,直到其中一方断开连接。
Server-Sent使用的是“问答”机制,连接创建后,浏览器会周期性地发送消息到服务端询问,是否有自己的消息,服务端会主动发送响应结果。
SSE的应用方面特点主要有:
1、只能服务端向客户端推送数据,半双工
2、兼容性稍差于WebSocket,几乎所有现代浏览器都支持 WebSocket 协议,包括移动浏览器。然而Microsoft IE 和 Edge不支持SSE
3、WebSocket(服务器推送)
WebSocket是HTML5提供的一种在单个TCP连接上支持全双工的通信协议,支持客户端与服务端之间建立持久连接。
图源:cloud.tencent.com/developer/a…
注:左为短轮询
WebSocket主要特性
- 使用之前需要先进行握手连接(通过 HTTP/1.1 协议的 101 状态码进行握手),是有状态的
- WebSocket 使用 ws 或 wss 的统一资源标志符(URI),其中 wss 表示使用了 TLS 的 Websocket。
- WebSocket 使用与HTTP协议相同的端口,ws是80端口,wss是443端口
- 可以实现服务端实时推送数据到客户端,客户端也可以给服务端发送数据
- WebSocket协议在低版本的浏览器不兼容
总结
基于本次业务情况,需要的是有新的数据时需实时推送到客户端,同时尽可能减少资源的浪费,选用WebSocket或者SSE;同时考虑到后续业务拓展可能会用到客户端主动发送数据,所有最终采用全双工的WebSocket协议。