我们可能会遇到一些需要网页与服务器保持连接的需求,比如类似网页版的聊天类应用,比如需要频繁更新页面数据的监控系统页面或股票看盘页面。我们通常采用如下几种技术。

短轮询

利用 ajax 定期向服务器请求,无论数据是否更新立马返回数据,高并发情况下可能会对服务器和带宽造成压力。

优点:开发简单
缺点:大多数情况下无用请求,占用服务端资源
实现方式:客户端每隔一段时间调用接口,无论有没有数据,接口立即返回
使用场景:不想折腾,消息及时性要求没有那么高,服务器资源充足

长轮询

利用 comet 不断向服务器发起请求,服务器将请求暂时挂起,直到有新的数据的时候才返回,相对短轮询减少了请求次数

优点:消息及时,命中率高,消耗服务资源少
缺点:在 Ajax 轮询的基础上做的改进,服务端和客户端需要同时改造,消息会有部分延迟(发生在请求交替之时)
实现方式:客户端在上次请求返回后,在发送下次请求,服务端当有数据或者超时后返回,没有数据时 hold 住连接(超时需要综合考虑服务器性能和及时性做出平衡,有代理的话需要考虑代理对于连接的超时机制)
使用场景:扫码登录、微信网页端获取消息等

SSE

服务端推送(Server Send Event),在客户端发起一次请求后会保持该连接,服务器端基于该连接持续向客户端发送数据,从 HTML5 开始加入。

WebSocket

适合于频繁和较大流量的双向通讯场景。

Spring webFlux

Spring5推出,近年来,Spring 一直在推崇响应式编程,这个框架可以使得前端只需发送一个请求,后台就会不断检查是否有新数据,有就往前端推送,或者指定间隔时间,每隔这段时间,就往前端推送一批数据,避免发送过多数据,耗尽带宽。