公司动态
当前位置:首页 > 公司动态 > 学术交流 > 消息推送技术简介

消息推送技术简介

作者:李果

      Web领域的实时推送技术,也被称作Realtime技术。这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新。它有着广泛的应用场景,比如在线聊天室、在线客服系统、评论系统、WebIM等。

      用户访问Web站点的过程是基于HTTP协议的,而HTTP协议的工作模式是:请求-响应,客户端发出访问请求,服务器端以资源数据响应请求。 也就是说,服务器端始终是被动的,即使服务器端的资源数据发生变化,如果没有来自客户端的请求,用户就不会看到这些变化。

      目前的 Web 应用是基于 HTTP 协议的,其规定了请求-响应的处理模型,位于应用层的单工通讯模式使得纯粹意义上的服务端推送方式变得难以实现。

      为了基于HTTP协议进行“推送”实现,可由客户端发起HTTP请求轮询,服务端在请求后返回响应。

      1.传统的消息推送技术

      1.1 简单轮询(Polling)

      客户端一般以定时方式发起请求,服务端处理后返回响应。

l  原理、客户端/服务端实现简单

l  所有浏览器都支持

l  可根据应用场景调整轮询时间间隔

l  服务端建立大量连接,并发压力大

      1.2长轮询

      客户端发起请求后服务端将该请求挂起(不返回响应),直到超时、异常或需要处理响应(推内容)才返回。客户端收到响应后再次请求(即轮询)服务端,并处理响应。

l  实时性高

l  服务端需要管理挂起请求

      1.3 HTTP

      客户端发起请求后服务器端处理请求,并通过 HTTP 流一直向客户端写入数据,直到超时或异常才返回响应。连接断开后客户端再次请求服务端,属于长轮询的一种。

      上面这些模式是不适合某些应用场景的,比如在社交网络用户需要近乎实时地知道其他用户最新的信息。对于普通站点来说, 请求-响应模式可以满足绝大多数的功能需求,但是在很多的应用当中,服务器软件需要向客户端主动发送消息或信息。因为服务器掌握着系统的主要资源,能够最先获得系统的状态变化和事件的发生。当这些变化发生的时候,服务器需要主动地向客户端实时地发送消息。例如股票的变化。在传统的桌面系统中,这种需求没有任何问题,因为客户端和服务器之间通常存在着持久的连接,这个连接可以双向传递各种数据。而基于HTTP协议的Web应用却不行。

      在Web世界中,服务器永远是被动地发送数据,前提是客户端必须先发送请求。浏览器其实并不知道服务器的信息什么时候会有改变,为了模拟实时的交流,或者不想错过某些信息,只能通过轮询(Polling)技术不断刷新页面来获得最新的数据(见图18-5)。这种方式不但浪费服务器的资源,最重要的是每次建立(或关闭)新的HTTP连接都有一定的延迟,这种延迟使得频繁信息传递的应用无法忍受。于是就产生了“服务器推送技术”。
      2.消息推送技术的发展

      在WebSocket出现之前,很多网站为了实现实时推送技术,通常采用的方案是轮询(Polling)和Comet技术,Comet又可细分为两种实现方式,一种是长轮询机制,一种称为流技术,这两种方式实际上是对轮询技术的改进,这些方案带来很明显的缺点,需要由浏览器对服务器发出HTTP request,大量消耗服务器带宽和资源。面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并实现真正意义上的实时推送。首先来看一下Comet技术(据说新浪微博使用的就是这种技术)

       2.1 Comet

l  低延迟通信,较长的存活期

l  也称反转Ajax(Reverse Ajax)

l  强调从服务器主动推送数据到客户端

l  实现形式:流(streaming)和长轮询(long polling)

       2.2 WebSocket

l  基于HTML5

l  基于长连接

l  WebSocket规范的目标是在浏览器中实现和服务器端双通信

l  需要现代浏览器的支持

      由于WebSocket是HTML5中新增的一种通信协议,这意味着一部分老版本浏览器(主要是IE10以下版本)并不具备这个功能,通过百度统计的公开数据显示,IE8目前仍以33%的市场份额占据榜首,好在chrome浏览器市场份额逐年上升,现在以超过26%的市场份额位居第二,同时微软前不久宣布停止对IE6的技术支持并提示用户更新到新版本浏览器,这个曾经让无数前端工程师为之头疼的浏览器有望退出历史舞台,再加上几乎所有的智能手机浏览器都支持HTML5,所以使得WebSocket的实战意义大增,但是无论如何,我们实际的项目中,仍然要考虑低版本浏览器的兼容方案:在支持WebSocket的浏览器中采用新技术,而在不支持WebSocket的浏览器里启用Comet来接收发送消息。

3.总结

    消息推送机制如此之多,我们应该选择哪一个呢?主要要考虑到两个方面:服务器的负载和浏览器的支持度。目前来说,在消息实时推送技术中, WebSocket等现在虽然在浏览器中实现和服务器端双通信,能更好的节省服务器资源和带宽并实现真正意义上的实时推送,但是在IE浏览器的低版本上无法实施。轮询机制由于它的实现简单,浏览器支持度高,依然被广泛的使用。