数据推送解决方案简介:短轮询,长轮询,eventSource,websocket

1,335 阅读3分钟

背景

作为开发人员我们都知道,页面上获取服务器上的信息最主要的都是通过客户端发起http请求,进行三次握手,四次挥手来进行。在一些数据实时性展示要求比较高的场景下,就需要服务器获取到新数据后需要及时的将数据推送到前端。

早期的我们都是通过轮询(短轮询长轮询)请求的方式来进行。web前端发展到现在,不管是长轮询还是短轮询都已经有自己的弊端,所以已经衍生出了新的推送方案websocketeventSource

什么是短轮询?

短轮询其实就是普通的定时检索。通过javascript的定时器setInternal定时器方法在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request请求,服务端在收到请求后,不论是否有数据更新,都直接对客户端进行响应。在服务端响应完成后,就会关闭这个Tcp连接,所以每次请求数据都会创建http请求。

6DB53723-D158-4262-9583-BF31F71EDD85.png

  • 优点:兼容性好容错性强,实现简单
  • 缺点:前端需要不断的发起http请求,占用了太多了服务器资源,在数据没有更新时发起的http都是多余的

什么是长轮询?

基于短轮询的缺点,衍生出了长轮询。长轮询是客户端发起http请求,服务器接收到http请求后,如果服务器没有数据更新,则这个http请求会被服务器挂起,直到请求超时由客户端再次发起请求,或者数据有变化了,服务器再把变化后的数据推送到前台。如此反复的进行轮询请求获取最新的数据。

91EBAB04-1B3D-4c02-864C-D77E611DE29B.png

  • 优点:长轮询和短轮询比起来,明显减少了很多不必要的http请求次数,相比之下节约了资源
  • 缺点:连接挂起也会导致资源的浪费

eventSource

eventSource又称SSE(Server-Sent-Events),一种服务器端到客户端(浏览器)的单项消息推送方案,它和轮询一样,也是基于http请求来完成的。但是和轮询不一样的是它是服务器与客户端建立连接后,服务器主动的向客户端进行数据推送。

7B2B7B77-B8BA-4d28-9B3B-5EEC8AE92382.png

  • 优点
    1. SSE是一个轻量级协议,相对简单。
    2. SSE默认支持断线重连。
    3. SSE支持自定义发送的数据类型。
    4. SSE不支持CORS,参数url就是服务器网址,必须与当前网页的网址在同一个网域(domain),而且协议和端口都必须相同。
  • 缺点
    1. 只适用高级浏览器,IE浏览器暂不支持
    2. 连接建立后,只能服务器给客户端推送数据,客户端无法给服务器端推送数据

websocket

SSE是服务器给浏览器单向推送数据的模式,如果在需要客户端给服务器发送消息时SSE显然不适合,这个时候我们就需要强大的数据推送功能websocket。websocket是一种在单个TCP连接上进行全双工通信的协议,与SSE最大不同就是浏览器和服务器建立连接后,双方可以互相发送消息

789F3720-7980-4d72-B55C-CC5E7213B843.png

  • 优点
    1. WebSocket支持自定义发送的数据类型。
    2. WebSocket客户端和服务器端可以互相发送消息
  • 缺点
    1. 消息连接后如果长时间没有消息通信,连接便会自动断开,需要发送心跳包,并且异常断开后需要重新重新连接。

对于eventSource和websocket的实战应用请参考以下连接