21

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

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

4

2 回答 2

23

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

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

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

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

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

于 2013-01-09T00:36:46.950 回答
13

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

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

可以使 Apache执行得更像 Nginx和类似的服务器。

于 2013-01-09T00:38:14.450 回答