咱们研发的平台已经完成了支持PC端和移动端的针对大量用户的实时消息推送体系,采用原生的socket创建长链接的技术来实现。当前阶段要开发相应支持web端的实时消息推送体系,如何实现摆在了个人面前,如下是我考察和论证的结果,和你们一块儿分享下,也欢迎你们指正我其中的错误或考虑不周之处。javascript
咱们了解到传统的web服务都是客户端发出请求,服务端给出响应。可是如今直观的要求是容许特定时间内在没有客户端发起请求的状况下服务端主动推送消息到客户端。php
不断地轮询(俗称“拉”)一般是咱们考虑获取实时消息的一个手段:最多见的例子你们应该不陌生,咱买火车票用的抢票软件,就是轮询啊,轮询啊...(话说我如今正抢票呢,亚历山大。后话:没抢上) *html
优势:服务端逻辑简单;java
缺点:其中大多数请求多是无效请求,在大量用户轮询很频繁的状况下对服务器的压力很大;python
应用:并发用户量少,并且要求消息的实时性不高;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推送。
固然,不至于本身造个轮子,因此决定选择现有的基于Comet技术的web框架来进行开发。你们能够经过wiki Comet 详细了解下Comet的历史及相关框架。其中有基于java的,基于php的,由于我常常使用Python写测试维护脚本并且发现python的框架很简洁,因此我初步选择的是用基于python的Tornado框架结合Comet技术来实现web的推送体系。