Rails中服务器发送事件的可伸缩性如何?

时间:2014-08-24 00:31:43

标签: ruby-on-rails ruby multithreading server-sent-events puma

我打算编写一个Rails应用程序,其中多个用户将使用ActionController :: Live和Puma使用服务器发送的事件将更新的信息推送给他们。我已经编写了一个测试应用程序,它看起来效果很好。对于我正在做的事情,SSE比WebSockets更有意义,因为大多数用户只是“倾听”而且SSE比设置websockets-rails更简单,这也取决于Faye(在这种情况下我只是自己编写)代码在Faye之上)。

我想知道的是Rails中服务器发送事件的可扩展性如何?这是在我将使用Puma的前提下,Puma为每个连接到EventSource的用户创建一个新线程。潜在地,这个应用程序的目标是有可能同时连接数十万用户,但是Puma的默认线程限制是16.我有什么理由不能将线程限制更改为200,000吗?

3 个答案:

答案 0 :(得分:6)

如果Puma为每个连接创建一个新线程,请不要使用它。您不仅一次计划成千上万的用户,而且只要它是一个Web应用程序,用户就可以在多个浏览器选项卡中打开多个实例。即使是the SSE specification warns against the "multiple tabs" problem,因为浏览器可能有自己的与一个主机同时连接数量的限制:

  

支持HTTP的每服务器连接限制的客户端可能会运行   如果每个页面都有从网站打开多个页面时遇到麻烦   一个EventSource到同一个域。作者可以避免使用   相对复杂的使用唯一域名的机制   连接,或允许用户启用或禁用   基于每页的EventSource功能,或通过共享单个功能   使用共享worker的EventSource对象。

使用连接不阻止的事务服务器。上面提到的gevent,基于Node JS或Ruby中的其他内容(我不知道,因此不能推荐任何东西)。

对于登陆此页面并可能会感到困惑的其他读者,Rich Peck的回答是错误的。服务器发送的事件不依赖于长轮询,也不会每隔几秒发送一次请求。它们是长期的HTTP连接,无需在每个事件后重新打开连接。没有“对服务器的持续请求”。

答案 1 :(得分:1)

关于每个客户端使用一个线程的Puma方法,假设每个服务器有16个线程的限制,也许您可​​以考虑水平扩展服务器?比如,如果您部署到amazon并设置Elastic Load Balancing + Auto Scaler,您的基础架构应该能够接受所需数量的客户端。还是我错了? 我想每个客户端禁止多个连接可以绕过多个选项卡问题,如果用户打开一个新选项卡,则会显示相应的错误消息。

答案 2 :(得分:-2)

我不确定线程​​问题,但根据经验,我可以给你一些关于SSE的想法


<强> SSE&#39; S

最重要的是要考虑SSE依赖于Javascript long polling,这意味着它会每隔几秒钟继续向您的服务器发送请求,以试图&#34;收听&#34 ;更新

设置SSE eventlistener时检查它 - 它会每隔几秒钟向您的服务器发送一次请求。连接不会是永久性的

这里有一个很好的讨论:What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?

-

这里的问题,至少在我看来,如果你向服务器发送不断的请求,它不仅效率低下,而且在功能方面也非常紧缩

pub/sub pattern一样,如果您想提供&#34;直播&#34;对用户进行更新,您首先需要进行某种身份验证(我相信SSE并不提供这种身份验证),并确保您拥有特定的&#34;频道&#34;这些用户可以接收的更新

话虽如此,有一篇关于creating a chat application with SSE's here的好文章:

enter image description here

我之前只使用过SSE来发送网站范围内的更新,因为我更喜欢单一连接(websocket),我可以对其进行身份验证。填充用户的特定数据


<强>推

我们尽可能地使用websockets

但诀窍在于,您可以使用第三方websock提供程序,例如Pusher。我不以任何方式与Pusher有任何关系;我们已将它们用于许多项目 - EPIC服务

使用Pusher,您将能够接受&amp;向您网站上的用户发送特定消息,而无需设置您自己的websocket服务器。您只需使用相同的JS设置(eventlistener)连接到Pusher的服务,该设置只会连接一次到Pusher服务: enter image description here

然后,您可以通过&#34;推送&#34;向用户发送更新。到Pusher API。我们已经初步设置了一个分析应用程序,我们正在构建here


要回答你的问题,我不知道SSE的可扩展程度

我倾向于从&#34;大&#34;互联网公司(作为如何做到这一点的演示&#34;对&#34;),我还没有看到他们中的任何人都喜欢SSE而不是网页套件。我可能错了,但他们都喜欢websockets