3. Envoy HTTP/2 连接管理:连接池、并发流限制、最大并发请求

在 Envoy 作为多租户网关或 Sidecar 代理时,HTTP/2 连接管理是保障租户隔离性与资源公平性的核心机制。Envoy 通过连接池复用、并发流上限和最大请求数三个维度,精细控制上游集群的连接行为。理解这些参数如何协同工作,是进行故障域隔离与流控调优的前提。

3.1 连接池架构与复用策略

Envoy 为每个上游集群维护一个独立的 HTTP/2 连接池。连接池的核心目标是减少 TCP 连接建立开销,同时防止单个租户的突发流量耗尽系统资源。连接池采用“按需创建、空闲回收”的策略,并支持以下关键配置:

配置项 类型 默认值 说明
max_requests_per_connection uint32 0 (无限制) 单个 HTTP/2 连接上最多可发送的请求数,达到后连接关闭
max_connections uint32 1024 连接池中允许的最大连接数
connect_timeout duration 5s 建立新连接的超时时间
idle_timeout duration 1h 空闲连接在池中保留的最大时长
调优要点: 在多租户场景下,建议为每个租户集群设置独立的 max_connections 上限,防止某个租户的连接泄漏或突发流量挤占其他租户的连接资源。同时,max_requests_per_connection 可用于定期轮换连接,避免长连接上的 HTTP/2 流状态累积导致内存泄漏。
Envoy HTTP/2 连接池架构 Envoy 代理 连接池管理器 HTTP/2 连接池 连接 #1 (活跃) 流: 3/100 | 请求: 45 连接 #2 (空闲) 流: 0/100 | 请求: 0 连接 #3 (等待中) 流: 0/100 | 请求: 0 上游集群 租户 A 后端 10.0.1.0/24 连接池按上游集群隔离,每个租户拥有独立的连接池实例,避免租户间连接资源争抢。 空闲连接超过 idle_timeout 后自动关闭,释放系统资源。

3.2 并发流限制与流控机制

HTTP/2 的多路复用特性允许在单个连接上并行处理多个流(Stream)。Envoy 通过 max_concurrent_streams 参数控制每个连接上允许的最大并发流数量。当并发流达到上限时,新的请求会被挂起或排队,直到有流完成释放。

关键参数:
  • max_concurrent_streams:默认值 100,控制单个 HTTP/2 连接上的最大并发流数。
  • initial_stream_window_size:默认值 65535 (64KB),控制每个流的初始流量控制窗口。
  • initial_connection_window_size:默认值 1048576 (1MB),控制整个连接的流量控制窗口。

流控机制采用滑动窗口算法,接收方通过 WINDOW_UPDATE 帧动态调整窗口大小。Envoy 作为代理,需要同时处理下游(客户端到 Envoy)和上游(Envoy 到后端)两个方向的流控。当上游窗口耗尽时,Envoy 会暂停从下游读取数据,形成背压(Backpressure)传递。

3.3 最大并发请求与排队行为

Envoy 在连接池层面提供了 max_pending_requests 和 max_requests 两个参数,用于控制请求的并发上限和排队深度:

参数 作用域 默认值 行为描述
max_requests 连接池 1024 连接池中所有连接上允许的最大并发请求总数
max_pending_requests 连接池 1024 等待获取可用连接的请求队列最大长度
max_retries 连接池 3 请求失败时的最大重试次数
故障域风险: 当某个租户的请求量超过 max_pending_requests 时,Envoy 会直接返回 503 响应。如果未设置合理的租户级隔离,一个租户的突发流量可能导致全局连接池的排队队列被占满,影响其他租户的正常请求。建议为每个租户集群独立配置这些参数,并设置比全局默认值更保守的上限。
请求排队与并发流控制流程 请求到达 并发 超限? 排队队列 max_pending_requests 连接池 max_requests 上游后端 503 拒绝 当并发请求数超过 max_requests 时,新请求进入排队队列;若排队队列已满(超过 max_pending_requests), Envoy 直接返回 503。排队队列中的请求等待连接池释放可用连接后,再被转发到上游后端。

3.4 参数调优建议与多租户隔离

在多租户场景下,Envoy 的 HTTP/2 连接管理参数需要结合租户的流量特征和 SLA 进行差异化配置。以下是一组推荐的调优策略:

  • 连接池大小: 对于高并发租户,适当增大 max_connections 和 max_requests;对于低流量租户,设置较小的上限以节省资源。
  • 并发流限制: 如果后端服务处理能力有限(如数据库连接池较小),降低 max_concurrent_streams 可防止后端过载。
  • 排队深度: 对延迟敏感的租户,设置较小的 max_pending_requests,让请求快速失败(503)而不是长时间排队。
  • 窗口大小: 在带宽充足、延迟较高的网络环境下,增大 initial_stream_window_size 和 initial_connection_window_size 可提升吞吐量。
实践案例: 某金融科技平台在 Envoy 中为 VIP 租户配置 max_connections=200、max_concurrent_streams=200、max_pending_requests=500;为普通租户配置 max_connections=50、max_concurrent_streams=50、max_pending_requests=100。通过这种差异化配置,在压测中 VIP 租户的 P99 延迟降低了 40%,且未出现因普通租户突发流量导致的资源抢占。