(下面是一个假设场景,当我发现 gRPC 负载平衡的复杂性以及由于长期存在的 TCP 连接而效率低下时,我想到了这个问题)
假设有一个 HTTP 客户端维护单个 TCP 长期连接,用于向位于 HA 代理后面的 API 服务发出 HTTP 1.1 请求。该服务有多个冗余服务器部分,我想平衡不同上游服务器之间同一 TCP 连接上的所有请求。这样的事情可能吗?
我知道客户端可以打开多个连接到 LB,这将有助于解决问题。
但我想知道是否可以使用某些 HA 代理配置直接执行此操作。如果没有,为什么缺少这样的功能?是由于某种网络/HTTP 协议限制吗?还是因为有其他解决方法,所以从来不需要这样的功能?
假设 TLS 在 HA 代理处终止,因此它可以执行 L7 路由。HAProxy 也只是一个例子,任何其他 LB/代理,如 Envoy、Nginx 都具有此功能?
好问题。
使用第 7 层 HTTP(S) 负载均衡器,您通常会得到一个“反向代理”样式的负载均衡器。在那种情况下,您(至少)会得到两个独立的连接;与客户端的 TCP 连接在反向代理上终止,反向代理建立并维护自己与后端服务器的连接(池)。
客户端与反向代理交换 HTTP(S) 协议消息,反向代理随后与后端服务器交换它自己的 HTTP(S) 协议消息。
在这样的设置中,没有理由无法在多个后端上平衡来自同一客户端通过同一 TCP 连接的后续 HTTP(S) 请求。
请注意,当您必须处理封装在 HTTP(S) 中的许多其他协议之一时,可能需要特别考虑。不管怎样,首选配置通常是某种形式的会话持久性/粘性,以确保来自同一客户端的后续请求确实进入同一后端服务器。
一切当然取决于你如何配置和调整你的负载均衡器......
https://docs.haproxy.org/2.7/configuration.html#4
以及许多更复杂的选项。