服务器推送事件在服务器端的成本

23
如果我正确理解Server-Sent Events原则,每当客户端注册到EventSource时,它实际上会打开一个新的HTTP连接到管理事件的资源。与其他HTTP请求不同,连接保持活动状态,因此专用于此客户端的服务器进程/线程将继续运行,直到客户端断开连接。
如果我们有1000个客户端连接到使用SSE的应用程序怎么办?难道就要同时运行1000个做同样任务的进程/线程来处理SSE吗?我猜我是错的,但如果我没有错,那真的比通常的AJAX轮询方法更有效吗?

6
使用像Apache这样的Web服务器将需要相当多的资源。但这就是为什么有像node.js这样的异步Web服务器存在的原因... - ThiefMaster
2个回答

24

是的,每个客户端会尽可能地保持连接开放。在1000个并发用户下,您将有1000个TCP/IP连接打开。

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

Apache通常为每个连接保留一个线程,因此成本相当高。对于Apache最好禁用KeepAlive并使用轮询。

但是,对于诸如node.js之类的事件驱动服务器,您可以仅拥有一个管理所有连接的进程,因此每个连接的成本要低得多,您应该能够轻松地保持数千个连接开放。

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


8
谢谢您的回答。基本上,如果有人计划在应用程序中使用SSE并期望有大量客户端,则必须使用事件驱动的Web服务器。 这是我阅读的关于SSE的文章中缺失的重要点。 - ouno

13
这取决于服务器的线程模型。Apache 默认为每个连接使用一个线程(或进程),因此,即使这些线程没有做太多的事情(如 SSE 连接所期望的那样),它们也会占用资源。
Nginx 这样的服务器采用稍微不同的模型,每个线程异步处理多个请求。 因此,SSE 和 WebSockets 等内容更加高效。
可以将 Apache 配置得类似于 Nginx 和其他类似的服务器,详见文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接