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

Ajax polling vs SSE (performance on server side)

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

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

"Polling" 对各方产生开销。如果可以避免,请不要投票。

如果 SSE 是一个选项,它可能是一个不错的选择。 "It depends".

问:您的应用需要处理哪种 "event(s)"(如果有的话)?

对于 Ajax,每分钟 1 个请求不可能总是更好,所以这个假设从一开始就是有缺陷的。任何一种频繁的轮询几乎总是一个代价高昂的选择。从另一个问题的 看来,您一开始就相信开放的 TCP 套接字(无论是 SSE 连接还是 webSocket 连接)在某种程度上对服务器性能来说代价高昂。空闲的 TCP 连接占用零 CPU(也许每隔一段时间,可能会发送一个保持活动状态,但除此之外,空闲套接字不使用 CPU)。它确实使用了一些服务器内存来处理套接字描述符,但是高度优化的服务器可以同时打开 1,000,000 个套接字。因此,您的 CPU 用法将更多地关注正在建立的连接数以及每次建立连接时他们要求服务器做什么,而不是关于有多少打开(并且大部分是空闲的)连接.

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

正如我在之前关于另一个问题的评论交流中所说的那样,这些类型的问题实际上无法抽象地回答。您必须对客户端和服务器都有特定的要求,并且对正在传输的数据有特定的了解,以及它在客户端的紧急程度,因此需要特定的轮询间隔和特定的规模,才能开始进行一些计算或测试工具评估哪种做事方式可能更理想。变量太多,无法得出纯假设的答案。您必须定义一个场景,然后针对该特定场景分析不同的实现。

每秒请求数只是众多可能变量中的一个。例如,如果大多数时候您轮询实际上没有任何新内容,那么这为 SSE 案例提供了更多优势,因为它根本无事可做(服务器上的零负载除了一点点内存用于大多数时候是一个打开的套接字)而轮询会产生持续的负载,即使无事可做。

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

轮询的第一个缺点是可能有很多次客户端正在轮询服务器,而服务器不得不花费资源来处理轮询请求,只是为了通知客户端它没有任何新内容。

How can we calculate where is the limit frequency for Ajax or SSE?

这是一个相当复杂的过程。需要定义特定场景中的许多变量。它并不像 requests/sec 这么简单。然后,您必须决定要测量或评估的内容以及测量的范围是什么? “服务器性能”是您提到的唯一一件事,但必须完全定义它,并且 CPU 使用和内存使用等不同因素必须加权到您正在测量或计算的任何内容中。然后,您甚至可能需要 运行 一些测试工具,如果计算没有产生明显的答案,或者如果决定非常重要以至于您想用真实指标验证您的计算。

听起来您正在寻找诸如“大于 x requests/min,您应该使用轮询而不是 SSE”之类的答案,我认为没有这么简单的答案。它取决于比 requests/min 或 requests/sec.

更多的东西