More Related Content Similar to Real-Time Web实时信息流推送 (20) Real-Time Web实时信息流推送4. 轮询 (Polling)
• 简单易用,容易实现
• 所有浏览器都支持
• 短连接
• 每次请求,立刻返回
• JSONP Polling 可跨域
• Script tag Polling 可跨域
缺点:
• 建立大量连接
• 服务器端并发压力大
• 很少被使用到
5. 示范代码
var polling = function() {
$.get("getServerTime", function(data)
{
$("#result").html("<strong>" + data
+ "</strong>");
}, "text");
}
setInterval(polling, 10000);// 每 10 秒请求
一次
7. 长轮询 (Long Polling)
• Http 1.1 Connection:keep-alive 长连接
协议
• 服务器端数据就绪可立即返回
• 服务器若未就绪,连接不断开,等待一段
时间
• 表现形式:
XMLHttpRequest
Script tag Long Polling
JSONP
9. XMLHttpRequest Long
Polling
• 形式自由简单,采用较多
• 错误处理、超时管理可控性强
• 默认无法跨域
• 采用跨域资源共享 CORS 可部分实现跨域
• 浏览器支持 CROS 情况
http://caniuse.com/cors
• head("Access-Control-Allow-Origin", "*")
11. Script tag Long Polling
• 表现形式 :
<script
src='http://xxx.domain.com/js/yourCometPro
vider.js' type='text/javascript'></script>
• 可跨域
• 风险 : 无法控制因跨域产生返回函数的执行
( 一个站点系无此担忧 )
• 一般应用于同一级域名,不同二级域名搭配使用
• 可使用 JSONP 规避此 javascript 风险
• 很棒的入门资料 :
Comet (long polling) for all browsers using ScriptCommunicator
12. 示范代码
客户端:
<script type="text/javascript">
var url = 'scriptTagDemo?time=' + new Date().getTime();
var on_success = function(){
doRequst(); // 执行成功后 , 重新发起请求
};
var on_error = function(){
alert("Something went wrong!");
};
var doRequst = function(){
ScriptCommunicator.sourceJavaScript(url, on_success, on_error);
};
doRequst();
</script>
服务器端返回:
ScriptCommunicator.callback_called = true;$('#div').html('Now Time : 2012-08-
22 09:58:04 078');
13. 轮询 VS 长轮询
• 短轮询一般定时请求
• 长轮询一般在上一次轮询完成之后,发起
下一个新的请求
• AJAX 长轮询时,最好标注超时时间
• 服务器端处理方式有所不同
16. Hidden iFrame
• 隐藏 iframe + htmlfile 组成
• 服务器发送 chunked 编码数据块
• 每个数据块即一段 javascript 代码
• 通过 javascript 渲染页面数据
• 各个浏览器都支持 iframe
• 在 IE 、 Firefox 下面效果最好
• 不可跨域
• 缺点: 错误处理可控性不强
20. Comet
Comet is a web application model in
which a long-held HTTP request allows
a web server to push data to a
browser, without the browser explicitly
requesting it.
-WikiPedia
基于 HTTP 长连接的“服务器推”技术,是一
种新的 Web 应用架构。基于这种架构开
发的应用中,服务器端会主动以异步的方
式向客户端程序推送数据,而不需要客户
端显式的发出请求。 - 百度
百科
21. Comet 解读
• 一种编程模型 , 若干实现技术组合
• 低延迟通信,较长的存活期
• 也称反转 Ajax(Reverse Ajax)
• 强调从服务器主动推送数据到客户端
• 实现形式:流( streaming )和长轮询
( long polling )
• JSONP Long Polling 可跨域
• CROS可跨域
24. 示范代码
var socket = new
WebSocket("ws://localhost:8000/websocket/tomcatWebsocke
t");
socket.onmessage = function(event) {
var ta = document.getElementById('responseText');
ta.value = ta.value + 'n' + event.data
};
socket.onopen = function(event) {
var ta = document.getElementById('responseText');
ta.value = "Web Socket opened!";
};
socket.onclose = function(event) {
var ta = document.getElementById('responseText');
ta.value = ta.value + "Web Socket closed";
};
26. Flash Socket
• WebSocket 的替代品 , 浏览器不支持可回退
• 客户端 JavaScript 与 Flash 交互调用:
JS 调用 Flash Socket 接口发送数据
Flash Socket 与服务器端 Socket 服务器通信
Flash Socket 接收到数据调用注册的 JS 函数
JS 渲染数据
• 优点:实现 TCP/IP 即时双向通信,真的很实时
• 缺点:
客户端须安装 Flash 插件
非 HTTP 协议
防火墙、代理服务器也可能对非 HTTP 通道端口
进行限制
27. 示范代码
<script type="text/javascript" src="../js/swfobject.js"></script>
<script type="text/javascript" src="../js/web_socket.js"></script>
<script type="text/javascript">
// Set URL of your WebSocketMain.swf here:
WEB_SOCKET_SWF_LOCATION = "../js/WebSocketMain.swf";
var socket = new WebSocket("ws://localhost:8000/websocket/tomcatWebsocket");
socket.onmessage = function(event) {
var ta = document.getElementById('responseText');
ta.value = ta.value + 'n' + event.data
};
socket.onopen = function(event) {
var ta = document.getElementById('responseText');
ta.value = "Web Socket opened!";
};
socket.onclose = function(event) {
var ta = document.getElementById('responseText');
ta.value = ta.value + "Web Socket closed";
};
</script>
28. 注意事项
• Flash Player 10 默认支持 Websocket
• 策略文件 policy file, 默认 843 端口
• 像 Websocket 一样使用 :
https://github.com/gimite/web-socket-js
• 最新 Flash 安装地址
http://www.adobe.com/support/flashplayer/down
• 移动端 Flash Lite 已经停止开发
(Android 、 Blackberry 、 Symbian) ,专注于
PC 端
• 但可以继续使用 Air 3.x ,性能达到原生 80%
29. Server-Sent Events
• HTML5 API ,专注 Server PUSH 通知
• 客户端开启一个 HTTP 连接 , 以 DOM 事件
形式接收收服务器端发来通知
• 该 API 目的在于它能够被扩展,使其能和
其他 push 通知机制协作
• Server-Client 单通道事件流 (Event
Stream) ,客户端无法通过此通道交互
• 类似于长轮询机制
• 发送头部 Content-Type:text/event-
stream
30. 示范代码
var source = new EventSource('eventsourceDemo');
source.addEventListener('message', function(e) {
trace(e.data);
}, false);
source.addEventListener('open', function(e) {
// trace("Connection was opened.");
}, false);
source.addEventListener('error', function(e) {
if (e.readyState == EventSource.CLOSED) {
trace("Connection was closed.");
}
}, false);
// 用户自定义事件 (User Customer Event)
source.addEventListener('userlogon', function(e) {
var data = JSON.parse(e.data);
trace('User login:' + data.username);
}, false);
34. Ping-Pong
• 客户端 / 服务器状态连接检查机制
• 心跳机制确定客户端 / 服务器端数据通信
• 连接超时处理
• 超时重新连接处理
• 连接状态的持久化处理
• 未及时发送数据缓存处理等
35. Poll VS Push
• Poll 适合小数据量,服务器消耗可无视
• Push 适合快速、较为实时环境
• 短连接频繁,可考虑较为高效的长连接
• 长连接耗费连接资源,在不传输数据时
• 长连接是一把双刃剑,需要慎重使用
• 注意服务器对并发 HTTP 连接的数量限制等
• 数据量大,服务器端可考虑合并数据
• 推送频繁客户端需要及时清理缓存,避免崩溃
• 某些环境两者结合 (Poll 大数据 Push 小数据 )
比如新浪某个人好友过多,超过 1W ,此时推送
数据量特别巨大,使用 Pull 较为合适
36. Java Support
规范支持不足,总是落后业界一步
Current:
• NIO(New Unblocked I/O)
• Servlet 3.0 Async
• JUC(java.util.concurrent)
• ...
Future:
• Servlet 3.1 Asynchronous Enhancement &
Websocket
• JAVA 7 AIO(Asynchronous I/O), 也称为 NIO2
• JUC Plus
• JAVA EE 7 Cloud Focused Upgrades
37. Servlet 3.0
• 异步特性:
– 异步请求 Servlet
– 异步过滤器 Filter
• 可挂起请求,而不是阻塞
• Tomcat 7 Support
• Jetty 8 Support
• Resin 4.0 Support
• Servlet 3.0 是一种进步,但还不够
38. Servlet Container & Comet
• Jetty 6+
Jetty Continuation 高性能
• Tomcat 6+
Advanced I/O
• Grizzly API
内嵌于 Glassfish
39. Servlet Container &
WebSocket
• 暂无规范 API ,各自实现
• Jetty 7+ 早已支持 WebSocket( 受众多 )
• Tomcat 7.0.27 开始支持
• Resin 4.0.2+
• 混乱!
41. 开源支持
• SOCKET.IO
http://socket.io
客户端 + 服务器端,完整成熟的解决方案
• Cometd
http://cometdproject.dojotoolkit.org/Bayeux 协议
• DWR
http://directwebremoting.org/dwr/index.html
严格意义上不算 Realtime Web 的代表
• Atmosphere
https://github.com/Atmosphere/atmosphere/
服务器端异步 Websocket/Comet 框架,兼容各种现有 Comet 、 Servlet 3.0 接口
• ......
• NIO Framework Backend Support:
Netty
Grizzly
Mina
XWorkweb
NIO
...
43. socket.io
• http://socket.io
• 客户端 + 服务器端完整解决方案
• 跨桌面端 + 移动端浏览器平台
• 通信信道集大成者,自动适应最佳协议
• 完善的错误、超时、重连处理机制
• Publish/Subscribe 模型完整实现
• 协议规范:
https://github.com/LearnBoost/socket.io-spec
44. 其它特性
• 重连后 , 服务器端缓存支持确保数据不丢失
• 支持一个连接,多个订阅
• 构建于 HTTP/Websocket 协议之上
• 连接状态丰富
disconnected, disconnecting, connected and
connecting
• 传输通道状态
closed, closing, open, and opening
• 支持心跳检测 / 连接超时
heartbeat/close timeout
• 社区活跃,参与者众多
45. 支持传输机制
• WebSocket
• Adobe® Flash® Socket
• AJAX long polling
• AJAX multipart streaming
• Forever Iframe
• JSONP Polling
保证所有浏览器自动适应,优先选择最优,跨越浏览器平台的解决方案
46. 支持浏览器
• Desktop
– Internet Explorer 5.5+
– Safari 3+
– Google Chrome 4+
– Firefox 3+
– Opera 10.61+
• Mobile
– iPhone Safari
– iPad Safari
– Android WebKit
– WebOs WebKit
48. 客户端示范 1
var socket =
io.connect('http://localhost');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my:
'data' });
});
49. 客户端示范 2
• 支持多 namespace( 支持订阅多个消息通
道 Channels)
<script>
var chat = io.connect('http://localhost/chat')
, news = io.connect('http://localhost/news');
chat.on('connect', function () {
chat.emit('hi!');
});
news.on('news', function () {
news.emit('woot');
});
</script>
50. 服务器端
• 默认为 node.js 实现
https://github.com/learnboost/socket.io/
• 开源社区提供若干语言实现
https://github.com/learnboost/socket.io/wiki
• Java 社区的支持
– ibdknox/socket.io-netty ( 不兼容最新 1.0 协议 )
– Ovea/Socket.IO-Java ( 不兼容最新 1.0 协议 )
– Gottox/socket.io-java-client
Socket.IO Client Implementation in Java
– yongboy/socketio-netty (Currently compatible
with 0.9+)
51. socketio-netty
• 基于高性能 NIO Framework Netty 构建
• 从无到有全新编写
• 兼容最新 socket.io client 以及 1.0 规范协
议
• 兼容目前所知 WebSocket 草案协议
• 项目地址
http://code.google.com/p/socketio-netty/
• 邮件组地址:
https://groups.google.com/group/socketio-netty
• 目前已被几家公司应用于实际产品 / 项目中
52. Example Live
• 示范在线演示入口地址:
http://socketio.yongboy.com/
• 在线聊天示范
http://socketio.yongboy.com/chat.html
• 在线画板示范
http://socketio.yongboy.com/whiteboard.html
53. 工作机制
1. 客户端发起一次握手请求 (POST) ,进行注册:
http://socketio.yongboy.com:8080/socket.io/1/?t=134534114618
2. 服务器进行授权,然后签名,并返回:
session id:heartbeat timeout:closing timeout:transports
eg:4d4f3dae355se:60:60:websocket,flashsocket,xhr-polling,jsonp-polling
3. 客户端根据返回的传输通道列表检测浏览器是否支持 , 发起传输
通道请求 , 并携带上 SESSION ID:
http://socketio.yongboy.com:8080/socket.io/1/websocket/4409080
5-a14d-410f-8197-943380226da7
4. 双方开始通信
心跳检测,发送 / 接受数据
5. 连接成功建立
54. 搭建一个 Realtime Web 平台
• 基于 socketio-netty也做一个 Realtime Web 平
台
• 初始化 IOHandler 接口接口,上传到服务器,初
始化应用实例,获得一个 API KEY
• 客户端引用 JS :
<script src="http://domain.com/yourfirebase.js"></script>
• 使用 API KEY :
var socket = yourbase.load("08235-sdxd-d23523s-d23d");
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
进阶阅读 :
http://www.blogjava.net/yongboy/archive/2012/0
55. 实时 Web(Realtime Web)
The real-time web is a set of
technologies and practices that enable
users to receive information as soon
as it is published by its authors, rather
than requiring that they or their
software check a source periodically
for updates.
新的名词 / 概念,对数据推送的重新包装
---Wikipedia
对数据推送的最合适的解读
56. Publish/Subscribe
• 发布 / 订阅( Publish/subscribe 或 pub/sub )是一种
消息范式,消息的发送者(发布者)不是计划发送其消息
给特定的接收者(订阅者)。而是发布的消息分为不同的
类别,而不需要知道什么样的订阅者订阅。订阅者对一个
或多个类别表达兴趣,于是只接收感兴趣的消息,而不需
要知道什么样的发布者发布的消息。这种发布者和订阅者
的解耦解耦可以允许更好的可扩放性和更为动态的网络拓
扑.
• 事件驱动编程模式
• 编程语言 ( 包括 JAVA) 对应观察者模式
• Comet/PUSH/Realtime Web ,更具体、广义的现实实
现
• 客户端订阅特定主题 / 话题 / 通道,服务器在数据到达时
及时推送给对应订阅者
57. 概念演进路线
• AJAX 异步请求 (XHR)
• 轮询 (XHR)
• 长轮询 (XHR/Script tag /JSONP)
• 流推送 (Hidden iFrame/XHR Streaming)
• Comet/Push
• Html5/WebSocket/FlashSocket
• Real-Time Web
58. 适用范围
• 在线多人游戏
• 实时数据统计
• Web 实时交互
• 聊天 /Whiteboard/Story Mall/Feeds Mall
• 页面信息实时推送
• 社交类网站信息流
• 实时协作 (eg:Google docs)
• 构建跨桌面 / 移动浏览器的应用
59. 商业公司的选择
• Twitter
Netty + Scala( 基于 JVM 函数式编程语
言)
• Facebook
Php + HipHop( 改写过的 PHP 虚拟机 )
• FriendFeed
Python + Tornado
• Google
Waver/Doc/Instant Search ...
60. Realtime Web Products
• http://www.pubnub.com/
• http://www.firebase.com/
• http://pusher.com/
• https://www.hydna.com/
• http://www.frozenmountain.com/
• http://aboutecho.com/
• http://www.spire.io/
• ......
61. Web-Hooks:PubSubHubbub
• PubSubHubbub是 Google 推出的一个基
于 Web-hook 方式的解决方案,重用
HTTP 协议,在订阅者所订阅的主题发生变
化时进行实时通知 ( 通过一可回调公网地
址)
• 一般应用于博客 / 文章订阅,发布者一旦有
更新内容,订阅者可以马上得到通知
• 可避免订阅者大量轮询对服务器造成压力
• 订阅者注册之后 , 等待回调即可 , 省去轮询
• Web-Hooks(callback url) 是一种服务器
端数据推送模式
63. WebRTC
• WebRTC是一个支持网络浏览器进行实时语音对
话或视频对话的软件架构
• 可基于 Javascript APIs 和 HTML5API 构建
• W3C 草案阶段,初步
• 新 , 重要 , 划时代 , 革新 , 欢迎!
http://code.google.com/p/webrtc/
• 但浏览器支持有限
• Chrome 20.0 和 Opera Mobile 12 已支持
• Firefox 计划支持
• 开源支持: webrtc4all ( 已全面支持 Windows 系
统)
65. SPDY
• SPDY 是 Google 开发的基于传输控制协议
(TCP) 的应用层协议
• 类似于 HTTP ,但旨在缩短网页的加载时间和提
高安全性
• 草案阶段,已开始推动 SPDY 成为正式标准
• 通过优先级和多路复用, SPDY 使得只需要建立
一个 TCP 连接即可传送网页内容及图片等资源
• 对用户透明 , 感觉不到,除加载速度快了一些
• socketio-netty 支持 SPDY 不复杂
67. SPDY Live
• 浏览器请求 SSL 握手期间决定是否采用
• 火狐 (about:config->spdy) 安装 SPDY indicator, 检测支持
会在地址栏显示绿色闪电图标
• chrome://net-internals/#spdy ( gmail.com )】
• Apache SPDY 加载图片演示
68. 走向和预测
• 和云结合,涌现更多租赁式
• 和更具体服务结合,诸如实时统计 / 搜索 /
市场营销
• 越来越多网站采用订阅 / 发布模式强推实时
信息流
• 基于 Web-Hooks 相关协议具有回调
callback 将大行其道 ( 站点簇 , 相互依赖 )
• 构建于 SPDY 协议上的更为高效的实时推
送
• WebRTC :如虎添翼,已进入人们视野
• HTTP 2.0 draft
69. 影响速度的一些因素
• 域名解析速度
– 每次请求域名解析速度,长轮询时明显
– 国内可考虑类似 dnspod.cn 服务
• 数据未压缩
– 数据合并
– gzip 压缩等
• 防火墙、代理服务器
– 可能的端口拦截
– 代理服务器配合和缓存
– 连接持久注意时长问题等
70. Server 编程注意事项
• Pragma:no-cache ( 一般不需要缓存 )
• Proxy-Connection:Keep-Alive
不是标准 , 但告诉代理服务器需要保持长连
接
• 及时刷新缓冲 (out.flush())
否则会发生缓冲区满才被发送到客户端
高延迟否则会造成送达延迟
• NIO/AIO + JUC
IO + Concurrency, 是构建的基础 , 需
要些功底
71. 客户端调试
• 利用浏览器内置的开发者工具
IE8(F12), Chrome(F12)
• 检测连接状态
调用 API 接口,利用 log 输出当前连接状态等
• 客户端日志输出 ( 支持 IE)
function trace(s) {
if ('console' in self && 'log' in console)
console.log(s);
else alert(s);
}
• 别忘记 Firefox + Firebug ,超强组合
• 注意页面端无用数据及时清理,避免崩溃
72. 一些可能需要了解的
• Google PubSubHubbub 推送协议
• WebHooks 推送协议
• 队列服务器 (Message Queue Server)
• Cache( 适当缓存 )
• ......
73. 示范代码
• 演示项目地址
https://code.google.com/p/realtime-
web-demo/
• SVN 检出地址 :
https://realtime-web-
demo.googlecode.com/svn/trunk/
• 需要 Tomcat 7.0.29 支持
• 注意 843 、 9000 端口不要被占用
• Enjoy it~
Editor's Notes Socket.IO and Binary Messages InfoQ: WebSockets 与 Bayeux/CometD Java Applets 已经被淘汰 可参考资料: Servlet 3.0 笔记之异步请求 Comet 推送长轮询 (long polling) 篇 http://www.blogjava.net/yongboy/archive/2011/02/17/346198.html Servlet 3.0 笔记之异步请求 Comet 推送长轮询 (long polling) 篇补遗 http://www.blogjava.net/yongboy/archive/2011/02/19/346197.html 长轮循是客户端发起的,间隔一定的时间向服务器请求事件, AJAX 前端实现方式。 优点 : 就是不需要保持和服务器一直联系 , 资源占用会少一些 缺点 : 可能会产生比较多的请求 , 或请求失败造成的数据混乱。 长连接服务器和客户端会保持一个长久的联系。 优点:数据更新即时性好,体验流畅。 缺点:对服务器的资源会有一个占用,所以相对占用资源比较大,另外 HTTP 长连接有时效性,不是可靠连接。 基于 jQuery Comet (long polling) for all browsers using ScriptCommunicator http://amix.dk/blog/post/19489#Comet-long-polling-for-all-browsers-ScriptCommunicator 可参考: Servlet 3.0 笔记之异步请求重新梳理 Comet 的几种形式 http://www.blogjava.net/yongboy/archive/2011/02/27/346195.html Servlet 3.0 笔记之异步请求 Comet 流推送 (Streaming) 实现小结 http://www.blogjava.net/yongboy/archive/2011/01/14/346204.html Servlet 3.0 笔记之异步请求 Comet 推送 iFrame 示范 http://www.blogjava.net/yongboy/archive/2011/01/10/346206.html Servlet 3.0 笔记之异步请求 Comet 推送 XMLHttpRequest 示范 http://www.blogjava.net/yongboy/archive/2011/01/13/346205.html 可参考: Servlet 3.0 笔记之异步请求重新梳理 Comet 的几种形式 http://www.blogjava.net/yongboy/archive/2011/02/27/346195.html Servlet 3.0 笔记之异步请求 Comet 流推送 (Streaming) 实现小结 http://www.blogjava.net/yongboy/archive/2011/01/14/346204.html Servlet 3.0 笔记之异步请求 Comet 推送 iFrame 示范 http://www.blogjava.net/yongboy/archive/2011/01/10/346206.html Servlet 3.0 笔记之异步请求 Comet 推送 XMLHttpRequest 示范 http://www.blogjava.net/yongboy/archive/2011/01/13/346205.html 借助于: web-socket-js 可考虑: https://github.com/rwldrn/jquery.eventsource https://github.com/Yaffle/EventSource/blob/master/eventsource.js 若采用 Phonegap 构建跨浏览器应用,可以采用 Websocket 协议 http://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSe61e35da8d318518767eb3aa135858633ee-7fea.html web-socket-js ,跨浏览器透明使用 WebSocket https://github.com/gimite/web-socket-js <!-- Import JavaScript Libraries. --> <script type="text/javascript" src="swfobject.js"></script> <script type="text/javascript" src="web_socket.js"></script> <script type="text/javascript"> // Let the library know where WebSocketMain.swf is: WEB_SOCKET_SWF_LOCATION = "WebSocketMain.swf"; // Write your code in the same way as for native WebSocket: var ws = new WebSocket("ws://example.com:10081/"); ws.onopen = function() { ws.send("Hello"); // Sends a message. }; ws.onmessage = function(e) { // Receives a message. alert(e.data); }; ws.onclose = function() { alert("closed"); }; </script> eg : 消息队列 JAX-RS 也是增强 Servlet 3.0 推出时间 JBoss AS 7: https://community.jboss.org/wiki/WebsocketSupportInAS7 Atmosphere The Asynchronous WebSocket/Comet Framework 是一个 Java 技术框架,其提供了通用的 API 来使用许多 web 服务器的 Comet 和 WebSocket ,这些 web 服务器包括了 Tomcat 、 Jetty 、 GlassFish 、 Weblogic 、 Grizzly 、 JBossWeb 、 JBoss 和 Resin ,其还支持任何支持 Servlet 3.0 规范的 web 服务器。 客户端支持不是那么强大 http://www.google.com/trends/?q=socket.io&ctab=0&geo=all&date=all http://www.google.com/trends/?q=cometd 构建于 HTTP/Websocket 协议之上 http://socket.io/#browser-support 目前服务器端支持最新协议的 socket.io 开源实现,就只剩下本人的 socketio-netty 了 为什么不基于 Jetty/Tomcat 构建原因在于: 1.Websocket 尚未成为规范 2. 使用高性能 Netty 实现 HTTP 堆栈相比 Tomcat/Jetty 少了很多层次的数据流转,只专注核心业务等 3. 缺少资助 / 动力 此处 Firefox + Firebug 进行演示 服务器授权可能会返回: 401 Unauthorized 503 Service Unavailable 等信息 没有自身注册,直接进入下一关,不会成功 展望,若做一个平台,如何去做,来源于: http://www.blogjava.net/yongboy/archive/2012/06/11/380508.html 来源: http://en.wikipedia.org/wiki/Real-time_web 实时 Web ,一组技术和实践的组合,保证用户可以最快速度接收发布者发布的信息,而不是需要周期性检测发布者的更新。 SOURCE: http://zh.wikipedia.org/wiki/%E5%8F%91%E5%B8%83/%E8%AE%A2%E9%98%85 更具体的 XHR = XMLHttpRequest http://zh.wikipedia.org/wiki/Scala 国外有关实时 Web 实时信息流发展远超国内,已经出现相关之力于此的公司和专业产品。 本人也想致力于更加产业化的进一步,但没有相应的工作环境 [ 教程 ] 如何使用 PubSubHubbub 协议 http://www.kangye.org/getting-started-with-pubsubhubbub/ PubSubHubbub 工作原理及使用入门 http://www.kangye.org/pubsubhubbub-tutorial 对康爷 PubSubHubbub 教程的一些补充 http://www.cnblogs.com/zhengyun_ustc/archive/2009/09/24/pubsub.html 图片来自(略有修改): http://timyang.net/web/pubsubhubbub/ http://zh.wikipedia.org/zh/WebRTC http://www.netsapiens.com/2012/02/24/webrtc-demo-apps-wow/ http://www.nojitter.com/post/232901217/webrtc-video-conferencing-in-what-browser Microsoft's WebRTC http://gigaom.com/2012/08/06/microsoft-webrtc-w3c http://zh.wikipedia.org/zh/SPDY 据说性能是 HTTP 的两倍 进阶阅读: http://www.slideshare.net/fabianlange/the-spdy-protocol SPDY 是什么?如何部署 SPDY ? http://www.geekpark.net/read/view/158198 Tomcat 8 Support Spdy http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/spdy/?pathrev=133764 打开图片,看在线版演示 简单提及,若深入,需要申请另外一场有偿培训,哈哈 ~ 默认情况下所在 HTTP1.1 中所有连接都被保持,在输出内容和长度无法一次性确定情况下,还是需要标明,需要客户端支持 启用 Keep-Alive 模式可避免了建立 / 释放连接的一些开销 Cache-Control: 指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control 并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括 no- cache 、 no-store 、 max-age 、 max-stale 、 min-fresh 、 only-if-cached ,响应消息中的指令包括 public 、 private 、 no-cache 、 no-store 、 no-transform 、 must-revalidate 、 proxy- revalidate 、 max-age 。各个消息中的指令含义如下: Public 指示响应可被任何缓存区缓存。 Private 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 no-cache 指示请求或响应消息不能缓存 no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 max- stale 指示客户机可以接收超出超时期间的响应消息。如果指定 max-stale 消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。 PubSubHubbu/WebHooks: 专注于服务器端主动推送给客户端,但要求客户端具有可访问的地址 ( 相对于服务器端 ) 客户端不需要主动建立连接,等待被呼叫即可 广义的发布 / 订阅模型 MQ Server, 消息队列服务器 , 和 socket.io 结合会更加有利于消息传递等 Message Queue Server: ActiveMQ Redis RabbitMQ ZeroMQ http://www.aqee.net/message-queue-shootout/ 哈,能够听完真个演讲,需要很大的耐心。