Ajax轮询与SSE(服务器端性能)

问题描述 投票:-1回答:2

我很好奇是否存在某种类型的标准限制,从服务器端的角度来看,何时更好地使用Ajax Polling而不是SSE。

  • 每秒1次请求:我很确定SSE更好
  • 每分钟1个请求:我很确定是更好的Ajax

但是每5秒1个请求呢?我们如何计算Ajax或SSE的限制频率在哪里?

server server-sent-events ajax-polling
2个回答
2
投票

对于Ajax来说,每分钟1个请求总是更好,所以这个假设从一开始就是有缺陷的。任何类型的频繁轮询几乎总是一个昂贵的选择。从我们之前在另一个问题的评论中的对话看来,您开始时认为开放式TCP套接字(无论是SSE连接还是webSocket连接)在某种程度上对服务器性能造成了巨大损失。空闲TCP连接占用零CPU(可能每隔一段时间,可能会发送一个保持活动状态,但除此之外,空闲套接字不使用CPU)。它确实使用一些服务器内存来处理套接字描述符,但高度调整的服务器可以同时拥有1,000,000个开放套接字。因此,您的CPU使用率将更多地是关于建立多少连接以及它们在每次建立时要求服务器执行什么,而不是关于有多少打开(并且主要是空闲)连接。

请记住,每个http连接都必须创建一个TCP套接字(在客户端/服务器之间往返),然后发送http请求,然后获取http响应,然后关闭套接字。这是每分钟要做的很多往返数据。如果连接是https,则由于加密层和端点认证,建立连接的工作和往返更多。因此,当您可以创建一个SSE连接并且客户端只是通过该连接侦听来自服务器的数据流时,为数十万个客户端做每一分钟的所有操作似乎都是浪费大量资源和带宽。

正如我在之前关于另一个问题的评论交流中所说,这些类型的问题在抽象中并不是真正的问题。您必须具有客户端和服务器的特定要求,并具体了解所传递的数据以及它在客户端上的紧急程度,因此需要特定的轮询间隔和特定的规模才能开始进行某些计算或测试线束。评估哪些可能是更理想的做事方式。有很多变数可以提出一个纯粹假设的答案。您必须定义方案,然后分析该特定方案的不同实现。

每秒请求数只是许多可能变量中的一个。例如,如果您轮询的时间大多数没有什么新的,那么这给SSE案例带来了更多的好处,因为它根本没有任何关系(服务器上的零负载除了用于的一小部分内存之外)大部分时间都是开放式套接字)而轮询会产生持续的负载,即使无所事事。

服务器推送(无论是使用SSE还是webSocket实现)的第一个优势是,当实际上有相关数据要发送到该特定客户端时,服务器只需对客户端执行任何操作。在剩下的所有时间里,套接字只是闲置在那里(可能偶尔会在很长的时间间隔内发送保持活动状态)。

轮询的第一个缺点是客户端可能有很多次轮询服务器,并且服务器必须花费资源来处理轮询请求,只是告知客户端它没有新内容。

我们如何计算Ajax或SSE的限制频率在哪里?

这是一个非常复杂的过程。需要定义特定场景中的大量变量。它并不像请求/秒那么简单。那么,您必须决定您尝试衡量或评估的内容以及规模? “服务器性能”是您唯一提到的,但必须完全定义,并且CPU使用率和内存使用率等不同因素必须加权到您正在测量或计算的任何内容中。然后,如果计算没有产生明显的答案,或者如果决策非常重要以至于您希望使用实际指标验证计算,则甚至可能需要运行一些测试工具。

听起来你正在寻找一个答案,比如“大于x次请求/分钟,你应该使用轮询而不是SSE”,我认为没有一个简单的答案。它取决于远远超过请求/分钟或请求/秒。


1
投票

“轮询”会导致各方面临开销。如果可以避免,请不要轮询。

如果SSE是一个选项,它可能是一个不错的选择。 “这取决于”。

问:您的应用需要处理哪些(如果有)“事件”?

© www.soinside.com 2019 - 2024. All rights reserved.