我正在阅读this post,它讨论SSE连接而不阻塞服务器线程作者正在描述如何解决阻塞问题。
我的困惑是如果我关闭服务器端的流(使用sse.close
)和客户端(使用source.close()
),为什么你首先遇到问题?为什么服务器挂起连接?
问题不在于关闭连接,而是关于你何时这样做 - 这种情况发生在后期(几十秒,甚至可能是几小时),而不是常规请求,通常在几秒钟内处理,即使对于最重的请求也是如此。 。
例如,让我们说(非常简化和近似):
这样每个线程每秒可以提供10个页面,所有线程 - 每秒100页,因为每个用户每10秒最多请求一个 - 您可以同时使用您的应用程序处理大约1000个用户。
现在,逐步向这些页面添加SSE更新:
这样,同一系统最多只能处理10个用户,即少100倍。而且你不能只将线程增加到1000,因为它们不是免费的(内存,调度程序开销等)。
问题在于,大多数时候大多数此类连接都没有做任何事情,只是等待事件,所以他们实际上不需要为它们保留一个线程。因此,在不关闭连接的情况下为其他请求释放线程是合乎逻辑的,这就是劫持的作用。
PS。这种方法可以进一步采用 - 客户端实时更新连接可以通过除rails服务器之外的进程(非ruby和更高效)保持打开,同时仍然在rails中执行所有事件逻辑。例如,对于ActionCable的anycable后端,您可以轻松地保留数千个并发连接