批量HTTP请求性能提升

M.A*_*oud 2 rest performance http

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

Cor*_*pto 5

批处理请求的性能提高取决于您对它们的处理方式。但是,就像这里的不可知论方法一样:

如果您可以管理保持活动的连接,则是的,这意味着您不必为该连接进行初始握手。这减少了一些开销,并且无疑节省了沿该连接处理后续数据包所花费的时间。因此,您可以“整理”请求并减少总体负载延迟(不考虑所有其他因素)。但是,HTTP1.1中的请求仍然绑定为FIFO,因此您可以挂断。这是批处理有用的地方。由于即使使用保持活动连接,您也可以具有此挂断(HTTP / 2将允许异步处理),因此请求之间仍然会有一些明显的延迟。

可以通过批量处理进一步缓解这种情况。如果可能的话,您将后续请求所需的所有数据汇总为一个,这样,所有内容将一起处理并作为一个响应发送回去。当然,与顺序方法相比,处理单个数据包可能需要更长的时间,但是由于请求->响应的往返延迟不会增加,因此吞吐量每次都会增加。因此,就请求处理速度而言,您可以获得更好的性能提升。

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

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


Cod*_*ter 5

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

执行的一般流程如下:

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

现在您已经得到了从网络服务器获取的一个对象。

现在,一路上的每个步骤都经过了大力优化,因为典型的服务器和客户端会多次执行它们。然而,即使其中一个步骤只需要一毫秒,当您有五十个资源需要获取时,这些毫秒加起来很快。

所以,是的,HTTP 保持活动状态缩短了 TCP 连接建立和预热所需的时间,但每个其他步骤仍然需要执行 50 次。是的,有 SQL 连接池,但对数据库的每个查询都会增加开销。

因此,如果您有一个端点可以一次接受 50 个标识符(例如通过逗号分隔的查询字符串,甚至是带有正文的 POST),并立即返回它们的 JSON 表示形式,而不是单独执行该流程 50 次,那么总是比个人请求快得多。