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

时间:2019-04-29 20:04:07

标签: server server-sent-events ajax-polling

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

  • 每秒请求1次:我敢肯定SSE更好
  • 每分钟1个请求:我敢肯定Ajax会更好

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

2 个答案:

答案 0 :(得分:2)

对于Ajax来说,每分钟1个请求总是更好,因此从一开始就存在假设错误。任何一种频繁的轮询几乎总是一种昂贵的选择。从我们之前的对话中,在对另一个问题的评论中,您似乎开始认为,打开的TCP套接字(无论是SSE连接还是webSocket连接)在某种程度上会损害服务器性能。空闲的TCP连接占用的CPU数量为零(也许很长一段时间内,可能每次发送一次保持活动,但除此之外,空闲的套接字不使用CPU)。它确实使用了一点服务器内存来处理套接字描述符,但是经过高度调优的服务器可以一次拥有1,000,000个打开的套接字。因此,您的CPU使用率将更多地取决于建立的连接数以及每次建立连接时服务器要求服务器执行的操作,而不是所涉及的开放(主要是空闲)连接数。

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

正如我在较早的关于一个不同问题的评论交流中所说的那样,这些类型的问题在摘要中并没有真正回答。为了开始进行一些计算或测试工具,您必须对客户端和服务器都有特定的要求,并且对所传递的数据有特定的了解,并且对客户端上的数据有多紧急,因此必须具有特定的轮询间隔和特定的比例。评估哪种可能是更理想的做事方式。只是有太多的变量无法得出纯粹的假设答案。您必须定义一个方案,然后分析该特定方案的不同实现。

每秒请求数只是许多可能变量之一。例如,如果大多数情况下您轮询的时候实际上并没有什么新内容,那么这对SSE案例将提供更多的优势,因为它根本没有任何事可做(服务器上的零负载仅占用很少的内存用于多数情况下都是开放的套接字),而轮询会产生持续的负载,即使无事可做。

服务器推送(无论是使用SSE还是webSocket实施)的#1优势是,只有在实际上有相关数据要发送到该特定客户端时,服务器才需要对客户端执行任何操作。在所有其余时间中,套接字只是闲置在那儿(可能偶尔间隔很长一段时间,发送保持活动状态)。

轮询的第一个缺点是,客户端可能会多次轮询服务器,并且服务器不得不花费资源来处理轮询请求,而仅仅是告知该客户端没有新内容。

  

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

这是一个非常复杂的过程。在特定情况下,需要定义许多变量。它不只是每秒请求数那么简单。然后,您必须决定要尝试测量或评估的内容以及规模是多少? “服务器性能”是您唯一提及的内容,但是必须完全定义,并且必须将不同的因素(例如CPU使用率和内存使用率)权衡到要测量或计算的内容中。然后,如果计算结果没有明显的答案,或者该决定非常关键,以至于您想用真实的指标来验证计算结果,那么您甚至可能需要运行一些测试工具。

听起来您正在寻找一个答案,例如“以大于x个请求/分钟的速度,应该使用轮询而不是SSE”,而且我认为没有这么简单的答案。它所依赖的东西远远超过请求/分钟或请求/秒。

答案 1 :(得分:1)

“轮询”在所有各方上产生开销。如果可以避免,请不要轮询。

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

问:您的应用需要处理哪种(事件)类型的“事件”?