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

Rav*_*ine 5 ruby multithreading ruby-on-rails server-sent-events puma

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

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

小智 6

如果Puma为每个连接创建一个新线程,请不要使用它.您不仅一次计划成千上万的用户,而且只要它是一个Web应用程序,用户就可以在多个浏览器选项卡中打开多个实例.甚至SSE规范都警告"多选项卡"问题,因为浏览器可能有自己的与一个主机同时连接数量的限制:

如果每个页面都有一个EventSource到同一个域,那么支持HTTP每服务器连接限制的客户端在从站点打开多个页面时可能会遇到麻烦.作者可以使用相对复杂的机制来避免这种情况,即每个连接使用唯一域名,或者允许用户基于每页启用或禁用EventSource功能,或者使用共享工作器共享单个EventSource对象.

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

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