当前位置: 首页 > 知识库问答 >
问题:

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

姬烨磊
2023-03-14

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

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

共有2个答案

毛德华
2023-03-14

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

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

Apache的性能更像Nginx和类似的服务器。

端木澄邈
2023-03-14

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

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

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

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

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

 类似资料:
  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 我试图让服务器发送的事件与Mozilla Firefox一起工作。给定一个Spring Boot的网络服务 使用Chrome浏览器或Edge(始终是最新版本)可以正常工作。我可以在网络分析器选项卡中看到未完成的请求,并且每秒都会显示一个新的时间戳。 然而,当我使用Firefox(84.0.2或更早版本)时,请求也会显示在网络选项卡中,但不会显示响应头或流数据。当我终止Spring后端时,Firef

  • http://www.html5rocks.com/en/tutorials/eventsource/basics/ 但是,我不明白一个重要的概念--是什么触发了服务器上导致消息发送的事件? 换句话说--在HTML5示例中--服务器只发送一次时间戳: 如果我建立一个实际的例子--例如,一个Facebook风格的“墙”或一个股票报价器,在这个例子中,每当某个数据发生变化时,服务器就会向客户机“推送”

  • 我有一个后端服务器,它将事件作为服务器发送的事件发送给客户端。我还没有找到一个好的库来在Android上处理这项技术,所以我一直在使用一种回退方法,定期检查服务器(通过访问事件endpoint)中的新事件。 后台服务每10秒执行一次。不用说,这不是最好的方法。如果没有任何开源库可用于此场景,那么在内存使用和电池消耗方面,定期检查服务器后端是否有新事件的最佳方法是什么?与在Android中管理开放式