Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails应用程序中的长轮询_Ruby On Rails_Websocket_Passenger_Long Polling_Faye - Fatal编程技术网

Ruby on rails Rails应用程序中的长轮询

Ruby on rails Rails应用程序中的长轮询,ruby-on-rails,websocket,passenger,long-polling,faye,Ruby On Rails,Websocket,Passenger,Long Polling,Faye,我有一个应用程序,它有一个页面,用户必须相对实时地看到这两个步骤是如何处理的 现在这是通过ajax短轮询完成的。我想把它改成一些服务器负担较轻的技术,我在Faye gem和ajax长轮询之间进行选择 Ajax长轮询更易于实现,不需要任何服务器入侵。需要4个ajax请求(页面将在完成2个步骤后得到通知)。 Faye gem将接受发送的3个请求,这不会少很多。而且它需要我设置我的nginx乘客服务器,一般来说更难实现和支持 我会选择ajax长轮询,但我听说在长轮询请求时需要运行整个Rails实例,这

我有一个应用程序,它有一个页面,用户必须相对实时地看到这两个步骤是如何处理的

现在这是通过ajax短轮询完成的。我想把它改成一些服务器负担较轻的技术,我在Faye gemajax长轮询之间进行选择
Ajax长轮询更易于实现,不需要任何服务器入侵。需要4个ajax请求(页面将在完成2个步骤后得到通知)。
Faye gem将接受发送的3个请求,这不会少很多。而且它需要我设置我的nginx乘客服务器,一般来说更难实现和支持

我会选择ajax长轮询,但我听说在长轮询请求时需要运行整个Rails实例,这会耗尽我的RAM。
另一方面,从这一点上,我了解到Rails可能没有长轮询的问题。那么,什么是真的呢,-来自多个客户端的ajax长轮询是否需要许多并发应用程序处理(这可能会过度分配我的一些资源,不确定是哪种)?

您的问题提出了三种不同技术的可能性:

  • websocket(,或您喜欢的任何websocket解决方案)
  • 短轮询(基于客户端的“拉”式通知)
  • 长轮询(客户端和服务器尝试持久连接-websockets之前的技术)
尽管WebSocket似乎是推送通知最具可扩展性和最自然的解决方案,但它与大多数情况一样,是一个特定于应用程序的问题。你需要考虑你的资源和需求,并以最好的方式平衡它们。

WebSocket和Short轮询都有一个“价格”。虽然短轮询更容易实现,但WebSocket允许真正的“推送”,其设计旨在节省web和服务器资源

至于WebSocket与长轮询,答案很简单——WebSocket将更高效

长轮询通过阻止浏览器发送的HTTP请求来模拟持续连接,直到服务器有数据“应答”。如果并发性无效,这可能会阻塞整个服务器,并且显然会阻塞负责响应请求的线程(服务器的线程池中有多少线程?8?24?)

相比之下,WebSocket是不阻塞但与服务器集成的持久连接。这是一个更加优雅和资源友好的解决方案

您可以在此处找到有关长轮询与短轮询的更多信息:

在示例中

假设在任何给定时刻,您预计有5000个活动客户端连接到您的网站(如果每个客户端每天连接30分钟,则假设总共有约240K个客户端,不考虑高峰和低谷即使用时间)

现在,让我们比较一下应用程序的
推送
/
更新
部分的资源:

  • 短轮询:如果每个客户端每2秒发送一次更新查询(不快,但也不太慢,取决于您的需要),那么您只需要每秒处理2500个请求来回答更新查询请求。每个请求都会影响应用程序的内存、性能和响应能力

  • 长轮询:您将有5000个连接被阻止并等待响应。这是5000个任务,每个任务可能会占用一个线程。。。即使您使用一些异步响应和线程池(这对于机架式服务器来说是非常困难的)来循环任务,您也会在等待更新时耗尽CPU和内存。此外,每次更新都需要您续订5000个连接(或者,如果幸运的话,HTTP/1.1的
    保持活动状态
    功能将使您免受此不便)。这些被阻止的连接将影响应用程序的响应能力和性能,使用CPU周期并关注真实请求。这可能(也可能不是)比每秒回答2500个请求要好。。。但不是很有效。推送数据是即时的

  • Websockets:您将有5000个连接添加到服务器的连接中。只要有任何活动(可能永远不会发生)并且没有线程被阻止,就会调用websocket回调。使用websocket连接发送的更新不会导致连接关闭,因此无需在每次更新时更新连接。推送数据是即时的

最后

根据设计,如果您有自己的服务器,那么您应该能够使用WebSocket服务比使用短轮询或长轮询更多的客户机

然而:

  • WebSocket(以及长轮询)比短轮询更难编码(它们使用非常宝贵的资源,即人工编码时间)

  • 一些托管服务(如Heroku)将限制websocket客户端的数量,使“数学”不那么确定。。。另一方面,这些相同服务的并发限制(req/sec)可能最终有利于websockets


  • 正如@myst建议的那样,websockets是您向用户视图添加实时更改的最佳选择。只需在您的答案中添加一点内容也必须尝试一下,或者可能是“短轮询模拟持久化…”---我想您指的是长轮询?@lakesare-对。看来我把长投票和短投票混在一起了。。。我会修好的。谢谢