负载均衡器能否平衡同一 TCP 连接上接收的多个请求?

负载均衡器能否平衡同一 TCP 连接上接收的多个请求?

(下面是一个假设场景,当我发现 gRPC 负载平衡的复杂性以及由于长 TCP 连接导致其效率低下时,这个问题就浮现在我的脑海中)

假设有一个 HTTP 客户端,它维护一个 TCP 长连接,用于向位于 HA 代理后面的 API 服务发出 HTTP 1.1 请求。该服务有多个冗余服务器,我想在不同的上游服务器之间平衡同一 TCP 连接上的所有请求。这可能吗?

我知道客户端可以与 LB 打开多个连接,这将有助于解决问题。

但我想知道是否可以使用某些 HA 代理配置直接执行此操作。如果不能,为什么缺少这样的功能?是因为某种网络/HTTP 协议限制吗?还是因为有其他解决方法,所以从未需要过这样的功能?

我们假设 TLS 在 HA 代理处终止,因此它可以进行 L7 路由。此外,HAProxy 只是一个例子,还有其他 LB/代理(如 Envoy、Nginx)具备此功能吗?

答案1

好问题。

使用第 7 层 HTTP(S) 负载均衡器,您通常会获得“反向代理”式负载均衡器。在这种情况下,您会获得(至少)两个独立连接;与客户端的 TCP 连接在反向代理上终止,而反向代理会建立并维护其与后端服务器的连接(池)。

客户端与反向代理交换 HTTP(S) 协议消息,反向代理随后与后端服务器交换自己的 HTTP(S) 协议消息。

在这样的设置中,没有理由不能在多个后端对来自同一客户端通过同一 TCP 连接发出的后续 HTTP(S) 请求进行负载平衡。

请注意,当您必须处理封装在 HTTP(S) 中的许多其他协议之一时,可能需要特别注意。无论如何,通常首选的配置是某种形式的会话持久性/粘性,以确保来自同一客户端的后续请求确实会发送到同一后端服务器。

当然,一切都取决于您如何配置和调整负载均衡器......

https://docs.haproxy.org/2.7/configuration.html#4

In layer 7 mode, HAProxy analyzes the
protocol, and can interact with it by allowing, blocking, switching, adding,
modifying, or removing arbitrary contents in requests or responses, based on
arbitrary criteria.

In HTTP mode, the processing applied to requests and responses flowing over
a connection depends in the combination of the frontend's HTTP options and
the backend's. HAProxy supports 3 connection modes :

  - KAL : keep alive ("option http-keep-alive") which is the default mode : all
    requests and responses are processed, and connections remain open but idle
    between responses and new requests.

  - SCL: server close ("option http-server-close") : the server-facing
    connection is closed after the end of the response is received, but the
    client-facing connection remains open.

  - CLO: close ("option httpclose"): the connection is closed after the end of
    the response and "Connection: close" appended in both directions.

The effective mode that will be applied to a connection passing through a
frontend and a backend can be determined by both proxy modes according to the
following matrix, 

...
等等等等
...

以及更多复杂的选项。

相关内容