实时轮询背后的技术

den*_*iss 4 javascript ruby-on-rails comet real-time node.js

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

我想知道它有多高效.

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

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

ale*_*lex 12

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

  • 轮询:应用程序每x毫秒发出一次请求以检查更新
  • 长轮询:应用程序向服务器发出请求,但服务器仅在有新数据可用时才响应(通常在X秒内没有新数据可用,发送空响应或连接被终止)
  • forever frame:在页面中打开一个隐藏的iframe,并为依赖于HTTP 1.1 chunked编码的doc发出请求
  • 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
使用JavaScript进行服务器轮询
长轮询和使用Comet之间存在差异
http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and- jquery
视频讨论不同的技术:http://vimeo.com/27771528

" 更快的网站 "一书有一整章(第8章)致力于"与彗星缩放".