说一下有什么方法可以保持前后端实时通信?
要点: 轮询、长轮询、 iframe流、WebSocket、SSE
答:
保持前后端实时通信的方法有以下几种:
1. 轮询是客户端和服务器之间会一直进行连接,每隔一段时间就询问一次。
- 缺点:连接数会很多,一个接受,一个发送。而且每次发送请求都会有Http的Header,会很耗流量,也会消耗CPU的利用率。轮询的间隔过长,会导致用户不能及时接收到更新的数据;轮询的间隔过短,会导致查询请求过多,增加服务器端的负担。
- 优点就是实现简单,无需做过多的更改。
- 适用场景:小型应用,实时性不高
2. 长轮询是对轮询的改进版,客户端发送HTTP给服务器之后,如果没有新消息,就一直等待。有新消息,才会返回给客户端。在某种程度上减小了网络带宽和CPU利用率等问题。由于http数据包的头部数据量往往很大(通常有400多个字节),但是真正被服务器需要的数据却很少(有时只有10个字节左右),这样的数据包在网络上周期性的传输,难免对网络带宽是一种浪费。
- 优点是做了优化,有较好的时效性。
- 缺点是保持连接会消耗资源; 服务器没有返回有效数据,程序超时。
- 适用场景:一些早期的对及时性有一些要求的应用,例如 web IM 聊天
3. iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长连接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。
- 优点是消息能够实时到达;浏览器兼容好。
- 缺点是服务器维护一个长连接会增加开销;IE、chrome、Firefox会显示加载没有完成,图标会不停旋转。
- 适用场景:客服通信等
4. WebSocket是类似Socket的TCP长连接的通讯模式,一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。
- 优点:在客户端断开WebSocket连接或Server端断掉连接前,不需要客户端和服务端重新发起连接请求。在海量并发和客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。
- 缺点是浏览器支持程度不一致,不支持断开重连。
- 适用场景:微信、网络互动游戏等
5. SSE(Server-Sent Event) 是建立在浏览器与服务器之间的通信渠道,然后服务器向浏览器推送信息。
- 缺点:SSE 是单向通道,只能服务器向浏览器发送,因为 streaming 本质上就是下载。
- 优点是SSE 使用 HTTP 协议,现有的服务器软件都支持。SSE 属于轻量级,使用简单;SSE 默认支持断线重连。
- 适用场景:金融股票数据、看板等