参考来源:《构建实时Web应用》
大致的流程就是从Ajax->HTTP长轮询->HTTP流->WebSocket
#实时性
随着一个信息的流传广度的提高,其价值也会迅速的减小。
而处于一个信息爆炸的时代,大数据,云计算等的兴起,为什么google被称为google帝国,就是因为其让各种数据更容易的被用户发现,页面索引的速度意味着我们仍然需要在搜索时等待待发现的数据。所以实时WEB成为一个非常值得注意的概念,其实实时web已经发展多年了,比如Twitter,FaceBook,甚至微博等等东西,为什么可以这么火,就是因为各种数据都是实时的,比如一夜短短十几分钟便被转发点赞几十万的优衣库时间,诸如此类
为什么现在越来越多的人依赖于Internet?其实就是因为即时信息带给人们的便捷性和新鲜感。
HTTP绊脚石: 在设计之初,客户端可以使用该协议请求获得数据并且接受相应,但是,一些Web应用程序开始要求信息从服务器发送到客户端,所以我们需要主动的进入客户端。主动进入客户端需要非标准,复杂的解决方案。考虑到不同的web浏览器支持的特性不同,要同时支持这么多的特性,必定是复杂的。
其实实时也只是一个宽泛的概念,不同的时间实时性也是不同的。
那么在解决服务器和客户端的延迟问题上,其实就是用Ajax来解决的。Ajax即是异步javascript和XML,但是它十分的依赖于浏览器中的事件,所以它并没有真正的解决关于请求内容实时更新的任何问题。于是发明了setInterval()函数来自动刷新的机制,每隔一段时间就检查一次更新。
然而以数据结构的角度这是一种很浪费资源的行为,并且效率十分的低下。最明显的问题就是它创建了许多的空的请求,这为应用程序带来了许多不需要的开销。
然后出现了HTTP长轮询(long-polling):这种方法打开一个HTTP请求,并且等待一段时间以侦听服务器的返回。如果有新的数据,那么服务器就会发送新的数据并且关闭请求,否则,在达到一定的时间限制后。就会关闭请求,打开一个新的请求。降低了开销,并且减少了应用程序发送的请求数,这种机制使得服务器可以在不需要客户端部分有任何动作的情况下就通知客户端有新的数据。**但是如果客户端和服务器之间需要双向的通信,那么如果用HTTP长轮询就只能再进行一次HTTP请求**,导致了资源的重复使用。而且这个技术还有一个重大的缺点,就是在两次长轮询请求之间有一个短小的时间间隔,在这段时间中客户端的数据与服务器的数据是不同步的,只有重新建立连接后,客户端才能检查是否有新的数据。
然后又有一种新的解决方法,就是HTTP流,相比HTTP长轮询,HTTP流的特点就是在新数据到达或者给定的间隔时间内连接不关闭,新的数据通过一直保持打开的现有连接传送。这种解决方案的好处是客户端与服务器间的连接都是持久化的,所以一旦有新的数据,就可以即时的发送给客户端,所有的新数据也都是通过相同的连接发送的。这保证了服务器和客户端能够保持同步。
但是仍然不能提供双向的通信。并且不同的WEB浏览器中的实现方式是不一样的,所以对应的响应缓冲区会越来越大,大到必须关闭连接,再重新打开。
其实流和长轮询方式可以直接统称为Comet,这是定义一种在应用程序结构中的范式。但是Comet将渐渐被WebSocket取代。这是不可阻挡的趋势,即使很多人表示这是不可能取代的。
Alex Russell说得特别好的一句话:"以WebSocket为利器乘风破浪,不再需要那些特别的术语做幌子了。"
**服务器发送事件(Server-Sent Event) 和EventSource API**是HTTP流解决方案的正式方案。
> Server-Sent Events
需要一个WebSockets服务器处理事件,立即返回给客户端、 Firefox7支持最新的hybi-10协议,把接受者的id传给服务端,如果是就更新通知数量、Opera11+。在HTML中添加一个发送向/,客 户端 等待三秒后再次发出下一个请求、Firefox6+,服务器将立即通知消息。
客户端打开一个WebSockets连接而且在/,不必为每个客户端都分配cpu和内存。
为什么WebSocket如此的激动人心,h5也被誉为跨时代的杰作呢?
因为WebSocket正式提供了一种标准化的方案来处理了双向通信的问题。并且为跨域的通信提供了内置的支持。
大致流程:通信发生在一个用户代理和一个远程主机之间。用户代理在一个受控环境中运行不可信的代码,远程主机可以有选择的与代码通信,基于Origin的安全模型 ,协议包括初次握手,然后在TCP上进行基本的消息成帧。并且使用单个TCP连接在服务器与客户端间通信,而不是使用多个TCP连接和单独的HTTP请求,所以开销减少了。
但是某 I 姓浏览器基础建设并没有跟上步伐,google了一下,在IE10之前的版本都是不支持WebSocket的...
##应用举例
比如现在网上看中国好声音的实时投票,包括现在很流行的弹幕等等。
头脑风暴: 毕竟那些已经有的东西,发明人都把钱赚了,那么以后怎么赚钱呢...
仔细想想,现在各种实时的东西好像都已经完善了,但是其实大多是虚拟的东西,于是可以在现实世界中找寻它的价值。
纪念非常有收获的一下午
--vampirebitter