背景:

我们研发的平台已经完成了支持PC端和移动端的针对大量用户的实时消息推送体系,采用原生的socket建立长连接的技术来实现。当前阶段要开发相应支持web端的实时消息推送体系,如何实现摆在了我的面前,以下是我考察和论证的结果,和大家一起分享下,也欢迎大家指正我其中的错误或考虑不周之处。

有哪些可以实现web消息推送的技术:

我们了解到传统的web服务都是客户端发出请求,服务端给出响应。但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推送消息到客户端。

  • 不断地轮询(俗称“拉”)通常是我们考虑获取实时消息的一个手段:最常见的例子大家应该不陌生,咱买火车票用的抢票软件,就是轮询啊,轮询啊...(话说我现在正抢票呢,亚历山大。后话:没抢上) *

    • 优点:服务端逻辑简单;

    • 缺点:其中大多数请求可能是无效请求,在大量用户轮询很频繁的情况下对服务器的压力很大;

    • 应用:并发用户量少,而且要求消息的实时性不高;


  • 长轮询技术:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息或超时(设置)才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求...

    • 优点:实时性高,无消息的情况下不会进行频繁的请求;

    • 缺点:服务器维持着连接期间会消耗资源;

    • 应用:WebQQ、知乎,Quora...


  • 基于Iframe及htmlfile的流(streaming)方式:iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长链接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。

    • 优点:消息能够实时到达;

    • 缺点:服务器维持着长连接期会消耗资源;

    • 应用:gmail+gtalk 产品;


  • 插件提供socket方式:比如利用Flash XMLSocket,Java Applet套接口,Activex包装的socket。

    • 优点:原生socket的支持,和最前面我说的PC端和移动端的实现方式相似;

    • 缺点:浏览器端需要装相应的插件;

    • 应用:在一些网络游戏中很多见;


  • WebSocket:是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。

    • 优点:更好的节省服务器资源和带宽并达到实时通讯;

    • 缺点:目前还未普及,浏览器支持不好;

    • 应用:我不清楚,哈哈;

技术选型:

鉴于自己印象里一直对web端推送中的Comet有些了解,上述的基于长轮询和基于iframe流的方式都是Comet的具体实现。其中使用也最为广泛,所以决定采用Comet技术来实现web推送。

web框架选择:

当然,不至于自己造个轮子,所以决定选择现有的基于Comet技术的web框架来进行开发。大家可以通过wiki Comet 详细了解下Comet的历史及相关框架。其中有基于java的,基于php的,因为我经常使用Python写测试维护脚本而且发现python的框架很简洁,所以我初步选择的是用基于python的Tornado框架结合Comet技术来实现web的推送体系。

参考文章:Comet:基于 HTTP 长连接的“服务器推”技术