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

时间:2013-01-08 22:57:14

标签: html5 http server-sent-events

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

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

2 个答案:

答案 0 :(得分:21)

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

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

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

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

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

答案 1 :(得分:13)

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

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

Apache可以发送到Nginx和类似的服务器。

相关问题