如果我正确理解Server-Sent Events原则,每次客户端注册到EventSource时,它实际上会打开一个新的HTTP连接到管理事件的资源。与其他HTTP请求相反,连接保持活动状态,因此专用于此客户端的服务器进程/线程将一直运行,直到客户端断开连接。
如果我们有1000个客户端连接到使用SSE的应用程序怎么办?我们是否有1000个进程/线程(做同样的事情)同时运行只是为了处理SSE?我想我错了,但如果我不是,它是否比通常的AJAX轮询方法更有效率,至少服务器不需要同时运行那么多进程/线程?
答案 0 :(得分:21)
是的,每个客户端尽可能保持连接打开。拥有1000个并发用户,您将打开1000个TCP / IP连接。
但是,每个连接是否使用线程取决于服务器。
Apache通常会为每个连接保持一个线程运行,所以它非常昂贵。使用Apache,最好禁用KeepAlive并使用轮询。
OTOH与基于事件的服务器(如node.js)一样,您只需要一个管理所有连接的进程,因此每个连接的成本要低得多,您应该能够轻松打开数千个连接。
关于SSE的一个很酷的事情是你也可以使用它进行轮询。它具有retry:
指令,指定客户端在重新连接(轮询)之前应等待多长时间。只需发送它并在需要轮询时关闭连接。
答案 1 :(得分:13)