Javascript 实时web应用程序的短轮询与长轮询?

Javascript 实时web应用程序的短轮询与长轮询?,javascript,http,comet,real-time,long-polling,Javascript,Http,Comet,Real Time,Long Polling,据我所知,我正在构建一个实时web应用程序,最流行的选择是短轮询和长轮询。测量一个与另一个相比可能有哪些优点和缺点? 短轮询(也称为基于AJAX的计时器): 优点:更简单,不消耗服务器(如果请求间隔时间较长)。 缺点:如果您需要在服务器事件没有延迟的情况下得到通知,则这是错误的。 (基于) 长轮询(也称为基于XHR的Comet) 优点:服务器事件发生时会立即通知您。 缺点:更复杂,使用的服务器资源更多。 (基于ItsNat) 只是为了争论 两者都是http请求(xhr),至少部分是不真实的,因为

据我所知,我正在构建一个实时web应用程序,最流行的选择是短轮询和长轮询。测量一个与另一个相比可能有哪些优点和缺点?

  • 短轮询(也称为基于AJAX的计时器):

    优点:更简单,不消耗服务器(如果请求间隔时间较长)。
    缺点:如果您需要在服务器事件没有延迟的情况下得到通知,则这是错误的。 (基于)

  • 长轮询(也称为基于XHR的Comet)

    优点:服务器事件发生时会立即通知您。 缺点:更复杂,使用的服务器资源更多。 (基于ItsNat)


    • 只是为了争论

      两者都是http请求(xhr),至少部分是不真实的,因为它使用了更多的服务器资源(完全取决于技术,稍后将解释)

      短期投票。 在服务器上处理的大量请求。创建大量流量(使用资源,但在发送回响应后立即释放资源):

      长轮询 一个请求发送到服务器,客户端正在等待响应(其未解决)。对于使用php/apache的服务器,这意味着需要处理一个派生的线程,该线程将保留资源,直到完成。因此,通信量较小,但您很快就耗尽了资源(或者更确切地说,您阻塞了资源)。但是如果您使用例如节点(或任何其他异步方法-C++ Qt),您可以潜在地将资源使用量最小化(在HTTP请求存储响应对象并在工作准备就绪时使用它)

      如果您将其与短轮询进行比较,您会发现在短轮询中可能会使用更多的传输,但在这3秒钟内,您实际需要1,5秒的处理时间(意味着在调用之间可能会执行某些操作)。在长时间投票中,始终使用相同的资源。现在,通常所有lib的php都是从4MB内存开始的,然后是一个4-20MB的框架。假设您有1024MB内存可用(免费)。假设我们持悲观态度,假设每个php Instance将使用25MB。这意味着您最多只能获得40个长轮询连接脚本

      这正是您可以使用Node提供更多服务的原因,因为Node不会生成其实例(除非您想使用worker等),所以使用相同的内存,您可能很容易挂起10k连接。当它们出现时,CPU会出现峰值,当它们可能被释放时,但当它们空闲时,就好像它们不在那里一样(您只需为保存在node/c++中的内存结构付费)

      网袋 现在,如果您想发送一些东西,无论它们在客户机中还是在客户机外,都可以使用websockets(ws-protocol)。第一个调用是http请求的大小,但稍后您只发送消息,从客户端到服务器(新问题)和服务器到客户端(回答或推送-甚至可以对所有连接的客户端进行广播)。有PHP WebSoCoSts LIBS,但同样,使用一些不同的技术-节点或C++最好。 有些lib,比如socket.io,有自己的层次结构,所以当websocket失败时,它会返回长轮询或短轮询

      何时使用。 短轮询-好吧,永远不会

      长轮询-当您与服务器交换单个呼叫时,服务器可能在后台执行某些工作。另外,当您不再在同一页面上查询服务器时。另外,当您不使用php作为层来处理长轮询连接时(node/c++可以是一个简单的中间层)。注意:长轮询确实是有益的,但只有在您这样做的时候


      Websocket-您可能会与服务器交换一个或两个以上的呼叫,或者可能来自您未预料到/未询问的服务器,例如电子邮件通知或其他内容。您应该根据功能规划不同的“房间”。接受javascript基于事件的特性;]

      如果您想获得基于数据库的实时应用程序,可以使用ajax长轮询和comet组合。 长轮询对您的bandwith非常有用,对用户MB也非常有用。因为当用户发送请求时,用户会像MB或某种internet连接一样付费。例如短轮询当您执行每秒发送请求之类的操作时,用户的internet使用率会更高,因为连接用户将为此付费(这意味着用户丢失Mb),但在长轮询中,用户只会为新消息付费

      Websocket确实是一件好事,但当你使用它时,你应该考虑一个大问题,即很多人不能使用聊天系统,因为Websocket只适用于新版本的浏览器


      @只要警察还在这里,就不要像网袋一样。您仍然可以使用iframe/script/xhr并防止服务器关闭连接。@metrobalderas:Google“ajax comet”对于其他研究此主题的人,这里还有一个关于主题的问题。特别是对于长时间轮询,限制服务器资源的主要因素是打开的套接字的最大数量。不同的操作系统有不同的限制,但也有限制,限制远低于可用内存。短轮询解决了这一问题,因为每个连接只在短时间内打开,因此许多连接可以进行时间复用。长轮询不使用更多资源,事实上它使用的资源要少得多。空闲套接字连接基本上不使用除保持活动的数据包(如果启用/配置)和打开的文件描述符以外的任何资源。示例不再可用。因此,从本质上讲,长轮询是一种可以是异步打开套接字的持久连接,虽然短轮询通常是同步进程的永久请求,但它本身并不是持久性的——它意味着您不立即从服务器发送响应等待——一旦您发送响应,它就会关闭——换句话说就是等待(挂起)。同样的行为
      00:00:00 C-> Is the cake ready? 
      00:00:01 S-> No, wait.
      00:00:01 C-> Is the cake ready?
      00:00:02 S-> No, wait.
      00:00:02 C-> Is the cake ready? 
      00:00:03 S-> Yes. Have some lad.
      00:00:03 C-> Is the other cake ready? ..
      
      12:00 00:00:00 C-> Is the cake ready? 
      12:00 00:00:03 S-> Yes.Have some lad.
      12:00 00:00:03 C-> Is the cake ready?