2013-01-08 165 views
16

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

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

+5

使用像Apache这样的网络服务器,它会非常耗资源。但这就是为什么像node.js这样的异步webservers ... – ThiefMaster

回答

17

是的,每个客户端都会保持连接处于打开状态。使用1000个并发用户时,您可以打开1000个TCP/IP连接。

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

阿帕奇通常保持为每个连接运行的线程,所以这是非常昂贵的。使用Apache最好禁用KeepAlive并使用轮询。

OTOH与像Node.js的,你可以只有一个过程,管理所有连接,所以每个连接的成本基于事件的服务器要低得多,你应该能够保持连接打开的数千容易。

约SSE很酷的事情是,你可以用它做轮询为好。它有retry:指令,它指定客户端在重新连接(轮询)之前应该等待的时间。只需发送该邮件并在要轮询时关闭连接。

+6

感谢您的答案。 好吧,基本上,如果他计划在自己的应用程序中使用SSE,并且需要大量客户端,则必须使用事件驱动的Web服务器。 这是我读过的有关SSE的文章中缺少的重要一点。 – ouno

11

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

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

Apache可以到perform more like Nginx和类似的服务器进行。