服务器端的服务器发送事件成本

Posted

技术标签:

【中文标题】服务器端的服务器发送事件成本【英文标题】:Server-Sent Events costs at server side 【发布时间】:2012-12-22 22:14:23 【问题描述】:

如果我正确理解服务器发送事件的原则,每次客户端注册到事件源时,它实际上都会打开一个新的 HTTP 连接到管理事件的资源。与其他 HTTP 请求相反,连接保持活动状态,因此专用于该客户端的服务器进程/线程一直运行,直到客户端断开连接。

如果我们有 1000 个客户端使用 SSE 连接到应用程序怎么办?我们是否会同时运行 1000 个进程/线程(做同样的事情)来处理 SSE?我想我错了,但如果我不是,它真的比通常的 AJAX 轮询方法更有效吗?至少服务器不需要同时运行那么多进程/线程?

【问题讨论】:

使用像 Apache 这样的网络服务器会非常消耗资源。但这就是为什么会有像 node.js 这样的异步网络服务器...... 【参考方案1】:

是的,每个客户端都尽可能保持连接打开。如果有 1000 个并发用户,您将打开 1000 个 TCP/IP 连接。

但是,每个连接是否使用线程取决于服务器。

Apache 通常为每个连接保持一个线程运行,因此它非常昂贵。对于 Apache,最好禁用 KeepAlive 并使用轮询。

OTOH 使用基于事件的服务器(如 node.js),您可以只使用一个进程来管理所有连接,因此每个连接的成本要低得多,并且您应该能够轻松地保持数千个连接打开。

SSE 很酷的一点是,您也可以使用它进行轮询。它有retry: 指令,指定客户端在再次重新连接(轮询)之前应该等待多长时间。只需发送它并在需要轮询时关闭连接。

【讨论】:

感谢您的回答。好的,基本上,如果他计划在他的应用程序中使用 SSE 并期望有大量客户端,则必须使用事件驱动的 Web 服务器。这是我读过的有关 SSE 的文章中缺少的重要一点。【参考方案2】:

这取决于服务器的线程模型。 Apache 默认为每个连接一个线程(或进程),因此,即使线程没有做很多事情(正如 SSE 连接所期望的那样),它们也会占用资源。

nginx 这样的服务器的模型略有不同,每个线程异步处理多个请求。所以像 SSE 和 WebSockets 这样的东西效率更高。

Apache 可以做成perform more like Nginx 和类似的服务器。

【讨论】:

以上是关于服务器端的服务器发送事件成本的主要内容,如果未能解决你的问题,请参考以下文章

使用 Netty HTTP2 实现支持服务器发送事件

Spring中的服务器发送事件客户端示例

如何使用带有Rust的Actix Web和WebSockets发送服务器事件?

Socket心跳包机制

SignarL服务器端发送消息给客户端的几种情况

GWT 将大量数据从服务器发送到客户端的最佳实践