影响服务器运行EventSources

Sha*_*313 6 javascript server-sent-events

我正在建立一个聊天只是为了好玩.我从来没有这样做,而我却在总体上试用EventSource API (Server-Sent Events)JavaScript.我刚刚听说它大约3天前,我觉得它比设置一个有趣且容易得多WebSocket.

我知道长时间的民意调查耗费了大量资源.但是,由于我从未听说过EventSource,它如何影响服务器?它是否耗尽了相同数量的资源?

我注意到,在Networks TabGoogle Chrome Developers Tool,该EventSource的不创建一个具有较大规模的内容(超过时间)的请求.拥有大量内容的1个请求会更好吗?

我的聊天目前正在运行两个EventSource.一个用于聊天本身(每次运行2500ms)和聊天中的"正在输入..."机制(每次运行250ms).

在大约一分钟的聊天之后,两个请求的组合内容大小是关于的150kb.这将增加更多的消息.

我担心我的主人会暂停我的帐户.这是我的一个朋友发生的事情,他使用了民意调查或长期民意调查(我忘了).我不确定EventSource是否使用尽可能多的资源作为轮询或长轮询.

主要问题:EventSource如何影响服务器?

  • 它是如何使用资源的?
  • 除了使用网络套接字之外还有什么更好的吗?
  • 拥有1个创建大型内容或有多个请求携带少量数据的请求会更好吗?

hex*_*ide 7

长轮询比 EventSource 使用更多资源,因为它不断建立和销毁连接。使用EventSource,仅使用单个连接,客户端正在等待数据,而不是检查服务器是否有新数据。

使用长轮询时,客户端将在以下情况下断开连接:

  • 客户端不需要更多数据
  • 客户端刚刚收到数据
  • 客户端等待数据超时

当服务器没有数据时,客户端将等待直到超时,直到服务器有数据。如果有数据,客户端会断开连接并创建另一个连接。如果客户端超时,客户端将断开连接并建立另一个连接。因此你可以从很多地方看到头顶。

长轮询

  • 如果客户端需要数据,它将建立一个新连接
  • 如果客户端超时,它会重新创建另一个连接
  • 如果客户端收到信息,它会重新创建连接

事件源

  • 客户端在与服务器的连接上创建一个套接字
  • 当客户端接收数据时,连接被维持并重用
  • GET由客户端使用带有Accept: text/event-stream标头的请求发起
  • 遵守同源限制

WebSockets

  • 客户端在与服务器的连接上创建一个套接字
  • 当客户端或服务器接收数据时,连接被维持并重用
  • HTTP GET使用带有Upgrade: websocket标头的请求发起
  • 可以发送到任何来源(跨域)

资源消耗:

EventSource的开销主要就是连接的存在。从这个意义上讲,它类似于 websocket,其中建立并维护单个连接。因此,由于持续的建立/销毁周期,使用长轮询您将收到最大的开销,来自 websocket 的第二大开销(因为它们是双向的),而来自 EventSource 的开销最少,这是单向的。

更好的选择:

对于客户端和服务器之间的实时双向通信,没有什么比 Websocket 更好的了。这是一种客户端和服务器相互监听数据而不是相互刺激数据的解决方案。

上交所要求

我认为您提出这个问题的假设是您认为 Chrome 中显示的内容是单独的请求。由于 EventSource 与服务器建立了套接字,因此您实际上正在读取通过 EventSource 套接字发送的累积数据量。因此,当您发送数据时,您将重复使用相同的连接,并且无需担心请求大小。


总之,大多数主机暂停轮询的原因是短轮询和长轮询都需要大量请求。如果您使用 EventSource 或 websockets,则您使用的是使用套接字的实时通信,套接字不会向 HTTP 服务器发送“垃圾邮件”请求。(如果我发送 100 个数据有效负载,EventSource 和 websockets 将使用相同的连接,长轮询将重新连接至少 100 次)您在这里唯一需要注意的是您的服务器可以处理的最大并发连接数,因为套接字比轮询使用更少的 CPU 和资源。

关于 EventSource/SSE 需要考虑的事项:

  • 使用传统的HTTP协议,websocket不使用
  • 与 websockets 相比,浏览器支持较少,但具有针对不支持的浏览器的 polyfills
  • 内置了对重新连接和事件的支持
  • 与 websocket 相比,协议更简单

  • 感谢您的精彩回答。我对此非常好奇。 (2认同)