为什么rails中的SSE挂在连接上?

问题描述 投票:1回答:1

我正在阅读this post,它讨论SSE连接而不阻塞服务器线程作者正在描述如何解决阻塞问题。

我的困惑是如果我关闭服务器端的流(使用sse.close)和客户端(使用source.close()),为什么你首先遇到问题?为什么服务器挂起连接?

ruby-on-rails server-sent-events
1个回答
1
投票

问题不在于关闭连接,而是关于你何时这样做 - 这种情况发生在后期(几十秒,甚至可能是几小时),而不是常规请求,通常在几秒钟内处理,即使对于最重的请求也是如此。 。

例如,让我们说(非常简化和近似):

  1. 你有10个线程/工人,没有SSE
  2. 你在0.1秒内为每个html页面提供服务
  3. 用户将等待最多1秒钟才能加载页面,然后再流下眼泪并远离您的网站
  4. 然后,用户将在请求下一页之前读取页面9秒

这样每个线程每秒可以提供10个页面,所有线程 - 每秒100页,因为每个用户每10秒最多请求一个 - 您可以同时使用您的应用程序处理大约1000个用户。

现在,逐步向这些页面添加SSE更新:

  1. 第一个用户连接,在0.1秒内获取html,然后一个线程在页面重新加载之前被SSE请求占用9秒,并且在重新加载之后它将再次被相同用户的请求锁定
  2. 你只有9个空闲线程
  3. 第二个用户连接,相同的重复

这样,同一系统最多只能处理10个用户,即少100倍。而且你不能只将线程增加到1000,因为它们不是免费的(内存,调度程序开销等)。

问题在于,大多数时候大多数此类连接都没有做任何事情,只是等待事件,所以他们实际上不需要为它们保留一个线程。因此,在不关闭连接的情况下为其他请求释放线程是合乎逻辑的,这就是劫持的作用。

PS。这种方法可以进一步采用 - 客户端实时更新连接可以通过除rails服务器之外的进程(非ruby和更高效)保持打开,同时仍然在rails中执行所有事件逻辑。例如,对于ActionCable的anycable后端,您可以轻松地保留数千个并发连接

© www.soinside.com 2019 - 2024. All rights reserved.