实时轮询技术

我现在正在查看Facebook新闻提要/股票代码,我想知道当我的任何连接进行更新时,它使用什么技术/体系结构来asynchronous提取数据。 我能想到的一个可能性是一个函数上的javascript setInterval ,它积极地为服务器轮询新数据。

我不知道这是多高效。

我能想到的另一种可能的技术就是Comet / NodeJS体系结构,它在服务器上进行更新时会ping客户机。 我对这个技术不太熟悉。

如果我想创造类似的东西。 我应该看什么? 第一种方法是这样做的首选方法? 那里有哪些技术可以让我做到这一点?

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

  • 轮询:应用程序每x毫秒发出一次请求以检查更新
  • 长轮询:应用程序向服务器发出请求,但服务器只在有新数据可用时才会响应(通常,如果在X秒内没有新的数据可用,则会发送空的响应或连接被终止)
  • 永远的框架:在页面中打开一个隐藏的iframe,并请求一个依赖HTTP 1.1分块编码的文档
  • XHRstream:允许从服务器发送连续的消息,而不需要在每次响应之后发出新的HTTP请求
  • WebSockets:这是最好的select,它始终保持连接
  • Flash WebSocket:如果WS本身不被浏览器支持,那么你可以包含一个Flash脚本来增强这个function

通常人们使用Flash WebSockets或长时间轮询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-c​​ame-before-websockets.html
使用JavaScript进行服务器轮询
长轮询和使用Comet是否有区别?
http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery
video讨论不同的技术: http : //vimeo.com/27771528

甚至更快的网站有一个完整的章节(第8章)致力于“与彗星缩放”。

我可能是错的,但是我认为Facebook依靠一种“长轮询”技术,可以在服务器上持续一段时间的http连接。 从服务器发送的数据触发了一个事件客户端,在那个时候被执行。 我会想象他们使用这种技术来支持没有内置websocket支持的旧浏览器。

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

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