web端实现消息实时性有哪些方式

短轮询:

基于http协议,客户端每隔一定时间与服务端建立http连接,无新消息就返回,有消息就把数据带回来。

优点:好理解,实现简单

缺点:隔的时间不好定,太长会影响实时性,太短就会对服务器压力大,浪费资源

长轮询:

同样也基于http协议,与短轮询不同的地方在于如果没有消息不是立刻就返回,反而会在服务端被hold住,直到超时(由服务端设置)或者有对应的消息产生。

实现原理:通常的做法是,在服务器的程序中加入一个死循环,在循环中监测数据的变动。当发现新数据时,立即将其输出给浏览器并断开连接,浏览器在收到数据后,再次发起请求以进入下一个周期,这就是常说的长轮询(long-polling)方式

优点:减少了两端的http通信

缺点:长轮询和短轮询比起来,明显减少了很多不必要的http请求次数,相比之下节约了资源。长轮询的缺点在于,连接挂起也会导致资源的浪费。因为长时间不释放连接更加考验服务端的并发量

长连接SSE:

SSE是HTML5新增的功能,全称Server-Sent Events。它可以允许服务推送数据到客户端。SSE在本质上就与之前的长轮询,短轮询不同,虽然都是基于http协议的,但是轮询需要客户端先发送请求。而SSE最大的特点就是不需要客户端发送请求,可以实现只要服务端数据有更新,就可以马上发送到客户端。

原理:严格来说,http协议是没有办法做服务器推送的,但是当服务器向客户端声明接下来要发送流信息时,客户端连接就会保持连接打开,SSE使用的就是这种原理。

优点:不需要建立或者保持大量的客户端发往服务器端的请求,节约了很多资源,提升应用性能并且SSE的实现非常简单,并且不需要依赖其他插件。

WebSocket:

websocket是HTML5定义的一个新协议,与传统的http协议不同,该协议可以实现服务器与客户端之间全双工通信。简单来说,首先需要在客户端和服务器端建立起一个连接,这部分需要http。连接一旦建立,客户端和服务端就处于平等的地位,可以相互发送数据,不存在请求和响应的区别。

优点:实现了双向通信

缺点:服务器端的逻辑非常复杂。现在针对不同的后台语言有不同的插件可以使用。

SSE与websocket比较:

1.SSE是单向通道,只能服务器向客户端发送消息,如果客户端需要向服务器发送消息,则需要一个新的http请求,这对比websocket的双工通道来说,会有更大的开销。这么一来的话就会存在一个什么时候才需要关心这个差异的问题,如果平均每秒会向服务器发送一次消息的话,那应该选择websocket。如果一分钟仅5-6次的话,其实这个差异不大

2.在浏览器兼容方面,两者差不多。在较早之前,每当需要建立双向socket时就会使用Flash,在移动浏览器不支持Flash的情况下,websocket的兼容是比较难做的。

3.SSE实现便利,实现一个完整的服务仅需要少量的代码,不需要启动一个新的服务,可以用任何一种服务端语言实现。

4.SSE基于http/https协议,可以直接运行于现有的代理服务器和认证技术

总结:  

从兼容性角度考虑,短轮询>长轮询>长连接SSE>WebSocket;

从性能方面考虑,WebSocket>长连接SSE>长轮询>短轮询。

另外:Http2.0也支持服务端主动推送

参考文章:

https://www.cnblogs.com/huchong/p/8595644.html

https://www.cnblogs.com/goloving/p/9196066.html

发布了47 篇原创文章 · 获赞 39 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_28119741/article/details/103997627