批量HTTP请求性能增益

时间:2016-12-16 17:50:45

标签: performance rest http

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

2 个答案:

答案 0 :(得分:4)

执行批处理请求的性能提升取决于您使用它们的操作。然而,就像这里不可知的方法一样:

如果您可以管理保持连接,是的,这意味着您不必为连接进行初始握手。这减少了一些开销,并且肯定节省了在此连接上处理后续数据包所花费的因此,你可以"管道"请求并减少总体负载延迟(所有其他未考虑)。但是,HTTP1.1中的请求仍然必须是FIFO,因此您可以拥有挂起。这是批处理有用的地方。因为即使使用保持连接也可以进行此挂起(HTTP / 2将允许异步处理),您仍然可以在请求之间存在一些重要的延迟。

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

当然,这种方法取决于您对要求它有效的要求。如果有很多用户使用大量数据执行此操作,有时批处理可能会给服务器带来太大的压力,从而提高所有用户的整体并发吞吐量,有时您需要采用技术上较慢的顺序方法来平衡问题。但是,您可以通过一些简单的监控和分析了解最佳方法。

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

答案 1 :(得分:3)

考虑这种典型情况:客户端具有驻留在HTTP服务器后面的数据库中的资源的标识符,他们想要获取对象表示的资源。

执行的一般流程如下:

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

你有它,一个从网络服务器获得的对象。

现在,这些步骤中的每个步骤都经过了大量优化,因为典型的服务器和客户端执行它们的次数很多。但是,即使其中一个步骤只需要一毫秒,例如当您获得五十个资源时,这些毫秒加起来很快。

所以是的,HTTP keep-alive会缩短TCP连接建立和预热所需的时间,但每个步骤仍然需要执行50次。是的,有SQL连接池,但每次查询数据库都会增加开销。

因此,如果你有一个可以同时接受50个标识符的端点,例如通过逗号分隔的查询字符串,甚至是带有正文的POST,并且返回它们的JSON表示,那么不要经过这个流程50次。曾经,这将始终比个人请求更快。