Performance 批处理HTTP请求性能增益

Performance 批处理HTTP请求性能增益,performance,rest,http,Performance,Rest,Http,我想知道执行HTTP批处理请求的性能增益。是否只是将往返次数减少到1次,而不是n次,其中n是HTTP请求的数量?如果是这样的话,我想您可以保持http连接打开并通过发送您的http消息,一旦完成,您可以关闭它以获得性能增益。执行批处理请求的性能增益取决于您对它们所做的操作。然而,正如一种不可知论的方法一样,你可以这样做: 如果您可以管理保持活动的连接,那么这意味着您不必为连接进行初始握手。这减少了一些开销,当然也节省了处理此连接上的后续数据包所花费的时间。因此,您可以“管道化”请求并减少总体负载

我想知道执行HTTP批处理请求的性能增益。是否只是将往返次数减少到1次,而不是n次,其中n是HTTP请求的数量?如果是这样的话,我想您可以保持http连接打开并通过发送您的http消息,一旦完成,您可以关闭它以获得性能增益。

执行批处理请求的性能增益取决于您对它们所做的操作。然而,正如一种不可知论的方法一样,你可以这样做:

如果您可以管理保持活动的连接,那么这意味着您不必为连接进行初始握手。这减少了一些开销,当然也节省了处理此连接上的后续数据包所花费的时间。因此,您可以“管道化”请求并减少总体负载延迟(所有其他都不考虑)。然而,HTTP1.1中的请求仍然必须是FIFO,所以您可以挂断。这就是批处理有用的地方。因为即使使用keep-alive连接,您也可能会出现这种挂起(HTTP/2将允许异步处理),因此请求之间仍可能存在一些显著的延迟

这可以通过分批处理进一步缓解。如果可能,您可以将后续请求所需的所有数据合并为一个,这样所有数据都将一起处理并作为一个响应发送回。当然,与顺序方法相比,处理单个数据包可能需要更长的时间,但是您的吞吐量每次都会增加,因为请求->响应的往返延迟不会成倍增加。因此,在请求处理速度方面,您可以获得更好的性能增益

当然,这种方法取决于您如何处理有效的请求。有时,如果有很多用户使用大量数据进行批处理,那么批处理可能会给服务器带来太大的压力,因此为了提高所有用户的总体并发吞吐量,有时需要采用技术上较慢的顺序方法来平衡。不过,通过一些简单的监控和分析,您将知道最佳方法


和往常一样,不要过早地进行优化:)

考虑以下典型场景:客户机拥有一个资源的标识符,该资源驻留在HTTP服务器后面的数据库中,他们希望获得该资源的对象表示

要执行的一般流程如下所示:

  • 客户端代码构造一个HTTP客户端
  • 客户端构建URI并设置正确的HTTP请求字段
  • 客户端发出HTTP请求
  • 客户端操作系统启动TCP连接,服务器接受该连接
  • 客户端将请求发送到服务器
  • 服务器操作系统或Web服务器解析请求
  • 服务器中间件将请求组件解析为服务器应用程序的请求
  • 初始化服务器应用程序,加载相关模块并将其传递给请求组件
  • 该模块获得一个SQL连接
  • 模块构建一个SQL查询
  • SQL server会找到该记录并将其返回给模块
  • 模块将SQL响应解析为对象
  • 模块通过内容协商选择合适的序列化程序,在本例中为JSON
  • JSON序列化程序将对象序列化为JSON字符串
  • 包含JSON字符串的响应由模块返回
  • 中间件将此响应返回给HTTP服务器
  • 服务器将响应发送到客户端
  • 客户端启动JSON序列化程序的版本
  • 客户端将JSON反序列化为对象
这里有一个从Web服务器获取的对象

现在,这些步骤中的每一步都经过了大量优化,因为典型的服务器和客户机执行它们的次数太多了。然而,即使其中一个步骤只需要一毫秒,例如,当您需要获取50个资源时,这些毫秒的总和也很快

是的,HTTP keep alive缩短了TCP连接建立和预热所需的时间,但每一步都必须执行50次。是的,存在SQL连接池,但对数据库的每个查询都会增加开销


因此,如果您有一个端点可以一次接受50个标识符,例如通过逗号分隔的查询字符串,甚至是带有正文的POST,并一次返回其JSON表示,而不是50次分别通过这个流,那么这总是比单个请求快得多

谢谢你的回答,这真的很有帮助。谢谢你的回答,这真的很有帮助。但是批处理请求包含一组HTTP请求,最后服务器将分别为每个请求提供服务,对吗?您的示例是一个案例,比如通过创建一个特定的资源/端点来处理DB的一个请求来检索集合资源。不,正如我在最后两段中试图解释的那样。您所说的“批处理请求”是指通过同一TCP连接发送的一系列请求。唯一可以修复的是建立独立的TCP连接。我对“批处理请求”的解释是,假设这个答案是在一个请求中发送所有ID,并且响应包含应用程序需要的所有实体。所以一个请求,可能一个数据库查询,一次(反)序列化,一个响应,所有这些都可以同时处理多个实体。