Page 250 - Web性能权威指南
P. 250
“实时”对不同的应用有不同的含义:有些应用要求毫秒级的精确度,而
有些应用可能只要几分钟同步一次就够了。要确定最佳的传输方式,首先
必须明确自己应用的延迟和性能目标!
15.7.1 通过XHR实现轮询
从服务器取得更新的一个最简单的办法,就是客户端在后台定时发起 XHR 请求,
也就是轮询(polling)。如果服务器有新数据,返回新数据,否则返回空响应。
轮询实现起来简单,但也经常效率很低。其中关键在于选择轮询间隔:长轮询间隔
意味着延迟交付,而短轮询间隔会导致客户端与服务器间不必要的流量和协议开销。
下面看一个简单的例子:
function checkUpdates(url) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onload = function() { ... }; ➊
xhr.send();
}
setInterval("checkUpdates('/updates'), 60000"); ➋
➊ 处理从服务器收到的更新
➋ 每 60 秒发送一个 XHR 请求
• 每个 XHR 请求都是一次独立的 HTTP 请求,平均算下来,每个 HTTP 会带有大
约 800 字节的请求 / 响应首部(不算 HTTP cookie)。
• 定时检查很有效,前提是数据能按时到达。可惜的是,按时到达只是例外,而非
常规情形。于是,定时轮询也会导致服务器端消息可用与交付给客户端之间的额
外延迟。
• 除非考虑周到,否则轮询对于无线网络来说常常会变成性能杀手(参见 8.2 节“消
除周期性及无效的数据传输”)。唤醒无线电模块会消耗很多电量!
最佳的轮询间隔是多少?没有唯一的答案。轮询频率取决于应用的需要,而且始终
都会存在关于效率和消息延迟的权衡。所以说,轮询最适合间隔时间长,新事件到
达时间有规律,且传输数据量大的场景。这个组合可以抵消多余的 HTTP 开销,并
将消息交付的延迟最小化。
XMLHttpRequest | 237