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

oun*_*uno 21 html5 http server-sent-events

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

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

Kor*_*nel 23

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

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

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

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

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

  • 感谢您的回答.好的,基本上,如果他计划在他的应用程序中使用SSE并且需要大量客户,那么必须使用事件驱动的Web服务器.这是我读过的关于SSE的文章中遗漏的重要一点. (8认同)

rob*_*rtc 13

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

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

可以使Apache 更像Nginx和类似的服务器.