实时轮询背后的技术

时间:2012-01-04 09:48:40

标签: javascript ruby-on-rails node.js real-time comet

我现在正在查看facebook新闻提要/自动收录器,我想知道当我的任何连接进行更新时,它使用什么技术/架构来异步提取数据。我能想到的一种可能性是在一个函数上使用javascript setInterval来积极地轮询服务器以获取新数据。

我想知道效率如何。

我能想到的另一种可能的技术是Comet / NodeJS架构,它可以在服务器上有更新时ping客户端。我对这项技术不太熟悉。

如果我想创造类似于此的东西。我该怎么办?第一种方法是首选方法吗?有哪些技术可以让我这样做?

3 个答案:

答案 0 :(得分:12)

有几种技术可以实现这一目标:

  • 轮询:应用每x毫秒发出一次请求以检查更新
  • 长轮询:应用程序向服务器发出请求,但服务器仅在有新数据可用时才响应(通常在X秒内没有新数据可用,发送空响应或连接被终止)< / LI>
  • forever frame:在页面中打开隐藏的iframe,并为依赖于HTTP 1.1分块编码的文档发出请求
  • XHR流媒体:允许从服务器发送连续的消息,而不需要在每次响应后发出新的HTTP请求
  • WebSockets:这是最好的选择,它可以始终保持连接状态
  • Flash WebSockets:如果浏览器本身不支持WS,则可以包含Flash脚本以增强该功能

通常人们在浏览器中没有WebSockets(最有效的传输)时使用Flash WebSockets或长轮询。

关于如何组合多种传输技术并将其抽象出来的完美示例是Socket.IO

其他资源:

http://en.wikipedia.org/wiki/Push_technology
http://en.wikipedia.org/wiki/Comet_(programming)
http://www.leggetter.co.uk/2011/08/25/what-came-before-websockets.html
Server polling with JavaScript
Is there a difference between long-polling and using Comet
http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery
视频讨论了不同的技巧:http://vimeo.com/27771528

这本书Even Faster Websites有一整章(第8章)致力于'与彗星一起缩放'。

答案 1 :(得分:0)

我可能错了,但我认为Facebook依赖于“长轮询”技术,该技术可以在一段固定的时间内保持http连接对服务器开放。从服务器发送的数据触发当时被操作的事件客户端。我想他们会使用这种技术来支持没有内置websocket支持的旧浏览器。

我个人一直在研究具有类似要求的应用程序,并选择使用node.js和socket.io的组合。 socket.io模块使用各种轮询解决方案,并根据客户端上可用的内容自动选择最佳解决方案。

答案 2 :(得分:0)

也许你可以看一下Goliath(用Ruby编写的非阻塞IO服务器):http://postrank-labs.github.com/goliath/