ruby-on-rails - Rails 中服务器发送的事件的可扩展性如何?

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

我正计划编写一个 Rails 应用程序,其中多个用户将使用带有 ActionController::Live 和 Puma 的服务器发送事件将更新的信息推送给他们。我已经编写了一个测试应用程序,它似乎运行良好。对于我正在做的事情,SSE 比 WebSockets 更有意义,因为大多数用户只是在“倾听”,而 SSE 比设置也依赖于 Faye 的 websockets-rails 简单得多(在这种情况下,我会自己编写Faye 之上的代码)。

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

最佳答案

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

Clients that support HTTP's per-server connection limitation might run into trouble when opening multiple pages from a site if each page has an EventSource to the same domain. Authors can avoid this using the relatively complex mechanism of using unique domain names per connection, or by allowing the user to enable or disable the EventSource functionality on a per-page basis, or by sharing a single EventSource object using a shared worker.

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

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

关于ruby-on-rails - Rails 中服务器发送的事件的可扩展性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25467567/

相关文章:

javascript - 如何将 Ruby 哈希输出为 Javascript?

javascript - actionCable rails 5.0.1 没有任何反应

ruby-on-rails - 如何更改此 ruby​​ 匹配线以返回 true 或 false

ruby - 为什么我们没有一个 group_by!在 ruby​​ 可枚举模块中?

java - 线程之间的信号

ruby-on-rails - config/application.rb 下的 I18n 配置被忽略

jquery_ujs 问题 : Font Awesome animated spinner works in Chrome but Not Safari

ruby-on-rails - 使用 hidden_​​field 标记时未定义的局部变量或方法 `f'

Java:为什么主线程没有进展?

multithreading - 二维 slice 的线程安全性,其中每个线程在第一维中都有自己的索引