Change Dir

先知cd——热爱生活是一切艺术的开始

统计

留言簿(18)

积分与排名

“牛”们的博客

各个公司技术

我的链接

淘宝技术

阅读排行榜

评论排行榜

服务器端的推

服务器端推的技术,对于普通的互联网站式应用是很少涉及到的,大家已经习惯了请求响应式的”拉“,但是对于现在ajax的快速发展,以及html5的诞生,服务器端的推送技术被越来越多的提到。这里总结几个push技术。如何push,给谁push,这就引出了推技术的核心——发布订阅模型。我们常见的推主要有email系统、RSS、IM、消息系统等。

假设一个场景,一个网站,想对登陆用户进行消息提醒,那么如何选择技术实现呢?现在大多数的实现是轮询——也就是间隔拉技术,定时的用ajax请求访问server,将返回的数据更新到页面上,通过间隔拉取来模拟出push的效果。但这毕竟还不是推,而且存在的核心问题就是请求浪费,资源浪费,本可避免的服务器端压力,总之一句话:低效率。

单纯的服务器端推:

1,http服务一般是做长连接的,连接不断开,那么当有事件发生时,服务器端可以定向的向持有连接的客户端push数据。

2,http响应header里的content-type设置为multipart/mixed这样的MIME,这种技术可以通过boundary来在header的content-type里设置一个边界值,客户端通过解析边界值来区分不同的显示部分。换句话说,服务器端告诉客户端这个响应是有多个部分的,客户端应该通过boundary来区分这些部分并分别处理。这种技术有个明显的劣势是IE不支持,多数是被用到webcam这样的应用中。

3,websocket,html5才支持的最新技术,优点嘛自然是高效,但是缺点就是客户端浏览器的支持度了。

另外的几种技术:

1,pushlet:与刚才1中提到一样的持久连接,服务端定期的返回js片段给到客户端,客户端持续显示loading状态,在收到js后执行,将结果更新到页面上。缺点的话是服务器端对客户端超时的控制没有掌握,在超时后,只有客户端主动刷新才能解决。详细优缺点参看这篇文章

2,长轮询:与传统定时轮询不同,长轮询会在服务器端阻塞请求,直到有数据的时候再做响应,而服务器端在接到响应后马上重新请求,如此往复。具体可以参看这篇文章

3,Flash XML Socket relays:通过加入一个relay服务器,这个服务器接收到客户端的一个请求,且这个请求基于tcp的连接,然后relay会返回一个id给到客户端,然后客户端会带着这个id请求web服务器,web服务器会把响应消息给到relay,relay再通过flash socket分发出去。当然tcp并发连接就是个瓶颈,但是这种做法的效率很高,对于小规模实现有益。

众所周知的服务器端推就是comet技术了,长轮询其实也是一种comet技术。comet技术本身是个泛化了的概念,具体实现可以有多种,但是通用且多数的实现时基于XHR(XMLHttpRequest)的ajax长轮询。

对于具体的业务场景,我们可能选择不同的服务器端推策略,对于现有的web应用比如聊天和消息可能TCP或者长连接就能解决问题,但是对于大并发下的大型网站,拉取是更合适的选择,长轮询可能用的会多一些。当然我们最期望的是websocket的表现~

参考文章:

http://en.wikipedia.org/wiki/Push_technology

http://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol

http://en.wikipedia.org/wiki/Internet_Relay_Chat

http://en.wikipedia.org/wiki/Comet_(programming)

http://en.wikipedia.org/wiki/MIME#Mixed-Replace_.28experimental.29

posted on 2012-08-12 10:51 changedi 阅读(2090) 评论(0)  编辑  收藏 所属分类: Java技术


只有注册用户登录后才能发表评论。


网站导航: