Comet 与传统的 Ajax 轮询相比性能方面是否占优?

来源:互联网 发布:python 贝叶斯分类 编辑:程序博客网 时间:2024/06/13 03:31
Comet 本质上和 C/S 中的通信并不一样,它是通过长连接来模拟推送的。也就是说,在没有数据的时候,这个连接挂起,直到有数据来了(推送),服务器端返回响应,该连接结束,客户端的 JS 重新建立下一个等待连接。

这种方式并不像 C/S 通信建立长期使用的通道,只是长期“等待”而已,避免了在数据更新频率不大的情况下轮询的开销:试想如果五分钟才一次更新,那么轮询方式在此期间几秒钟就要发生一次请求&响应,而这些请求响应都是没有价值的,因为它们并没有传输有用数据。Comet 避免的是这方面的浪费,不再有空请求,因为挂起的连接直到数据更新了才结束。

性能方面,对于数据量不大但需要实时更新的应用来说,Comet 能更有效利用连接,同时因为没有轮询的心跳频率,Comet 会比轮询更加实时——因为只消耗响应的网络传输时间。

但是 Comet 本身并不能在数据传输方面提供比轮询更高的效率,仅仅避免了轮询的空请求浪费。所以 Comet 和 web socket 之类的通讯方式差距还是有的。

大型网站的应用方面,知乎、QQ 邮箱都有用到 Comet,还有新浪微博的私信(聊天)。使用 Comet 主要需要是服务器端的支持,因为使用长连接,所以要有一定负载量一般得使用异步的网络框架,Python 的 tornado、gevent 和 JavaScript 的 node.js 都是此列。