轮询,Comet,WebSockets等

时间:2011-01-31 20:55:33

标签: ajax comet websocket polling

我需要在Web应用程序中构建一些非常激进的“自动刷新”功能。它是一种照片库,图像存储在AmazonS3上,但有关图像的数据存储在我们自己的数据库中。我玩过轮询服务器并发送ajax调用以获取更新的数据。我真的很担心这种方法对服务器的负载。有时,页面需要每15到30秒更新一次。

我一直在看Comet而我只是没有卖掉这个“黑客”是个好主意。 WebSockets可能会有所帮助,但我担心它们太新,太不受支持了。那么,话虽这么说,是否有人建议如何构建一个需要经常刷新并有可能拥有非常高的用户群的系统?

我并不认为只是为这个问题投入更多的服务器,但不相信这也是最好的方法。在其他人建议之前,我不能做Flex,因为网络应用必须在iPad上运行。

2 个答案:

答案 0 :(得分:7)

WebSockets似乎是一个相当不错的选择。由于工作组已经开始发布解决问题的草稿,因此在Firefox 4和Opera 11中禁用WebSockets可能是暂时的。此外,即使在已禁用本机WebSockets的浏览器上,web-socket-js Flash回退仍然有效。另外值得注意的是iOS 4.2具有本机WebSockets。因此,使用本机WebSockets +后备,几乎可以支持WebSockets。

如果您使用WebSockets,您可能还需要考虑推送更新而不是让客户端进行轮询。这将有助于防止客户端意外地DDOS服务器。延迟只会在客户端上升,此时您可以开始在服务器端添加更多资源。

如果服务器端Javascript不是不可能的,那么您可以查看Socket.IO这是一个Nodejs WebSockets框架,它选择客户端和服务器自动支持的最佳传输(更喜欢本机WebSockets,然后WebSockets后备,然后是各种长轮询选项)。它还使服务器和客户端代码看起来非常相似,因为它包含一个客户端库。 Socket.IO目前似乎有很多想法。

如果你以Ruby为中心,你可能想看看em-websockets。 Socket.IO和em-websocket都是基于事件的服务器,它允许非常高的客户端数量,特别是在延迟而不是带宽是最重要的情况下。

答案 1 :(得分:0)

WS-I小组发布了名为"Reliable Secure Profile"的内容,其中有一条Glass Fish和.NET implementation显然inter-operate

运气好的话还有Javascript实施。

还有一个使用HTTP Duplex.的Silverlight实现。当发生推送时,你可以connect javascript to the Silverlight反对获取回调。

还有commercial paid versions