1. 课程导论:多租户故障域与 HTTP/2 流控的关系,Envoy 在其中的角色
1.1 为什么多租户架构需要关注 HTTP/2 流控?
在微服务网格中,多租户意味着多个业务单元(租户)共享同一套数据平面代理(Envoy)和底层网络资源。每个租户的流量都通过相同的 HTTP/2 连接进出,而 HTTP/2 的多路复用特性使得多个流(Stream)可以并发地在一条 TCP 连接上传输。这种共享机制在提升资源利用率的同时,也引入了故障域扩散的风险:一个租户的异常流量行为(如慢客户端、突发大请求、流控阻塞)可能通过共享的 HTTP/2 流控机制“传染”给其他租户。
核心问题: 当租户 A 的某个流因处理缓慢而暂停接收数据时,HTTP/2 的流级别流控(Stream Flow Control)会反压发送方,但若流控参数配置不当,这种反压可能升级为连接级别流控(Connection Flow Control),导致整条连接上的所有租户流量都被阻塞,形成跨租户的级联故障。
1.2 多租户故障域的定义与分类
故障域(Failure Domain)是指系统中一个组件发生故障时,可能影响到的其他组件的范围。在多租户 Envoy 网格中,故障域按粒度可分为三个层级:
| 故障域层级 | 影响范围 | 典型场景 |
|---|---|---|
| 流级别 | 单个 HTTP/2 Stream | 租户 A 的某个请求因后端处理慢导致流控窗口耗尽,仅该请求被阻塞 |
| 连接级别 | 共享同一 TCP 连接的所有租户 | 租户 B 的流控反压导致连接初始窗口耗尽,阻塞租户 C 的新请求 |
| 节点级别 | 同一 Envoy Worker 线程上的所有租户 | 某个租户的恶意流量耗尽 Worker 线程资源,导致同线程其他租户超时 |
调优目标: 通过精细调整 HTTP/2 流控参数,将故障域尽量控制在流级别,避免故障扩散到连接级别或节点级别,实现租户间的有效隔离。
1.3 Envoy 在流控隔离中的角色
Envoy 作为数据平面的核心代理,处于客户端与上游服务之间,是实施 HTTP/2 流控策略的关键节点。它负责:
- 流控窗口管理: 维护每个 HTTP/2 连接的
initial_connection_window_size和每个流的initial_stream_window_size,控制数据发送速率。 - 流控反压传递: 当上游服务处理缓慢时,Envoy 会减少向下游发送的 WINDOW_UPDATE 帧,从而反压客户端;反之亦然。
- 多租户流量调度: 通过连接池和负载均衡策略,将不同租户的请求分配到不同的上游连接或集群,实现物理或逻辑隔离。
- 流控参数动态调整: 支持通过 xDS 控制平面动态下发流控配置,无需重启代理即可调整隔离策略。
1.4 关键流控参数及其对故障域的影响
Envoy 中与多租户故障域隔离最相关的 HTTP/2 流控参数如下表所示。错误的参数组合会直接导致故障域扩大。
| 参数名称 | 默认值 | 作用域 | 对故障域的影响 |
|---|---|---|---|
initial_stream_window_size |
65535 (64KB) | 每个 Stream | 值过小 → 流频繁暂停 → 增加连接级反压风险;值过大 → 单个流占用过多缓冲区 |
initial_connection_window_size |
1048576 (1MB) | 整个连接 | 值过小 → 连接窗口易耗尽 → 所有租户流被阻塞(故障域扩散到连接级) |
max_concurrent_streams |
100 | 连接 | 限制并发流数量 → 防止单个租户创建过多流耗尽连接资源 |
stream_idle_timeout |
5s | 每个 Stream | 及时清理空闲流 → 释放流控窗口资源 → 减少故障域滞留 |
常见误区: 很多团队只调整
initial_stream_window_size 来提升吞吐,却忽略了 initial_connection_window_size 与并发流数量的比例关系。例如,当连接窗口为 1MB,而 10 个并发流每个窗口为 256KB 时,总需求 2.56MB 远超连接窗口,导致连接级反压频繁触发,所有租户的流都受影响。
1.5 课程实验目标与测试方法
本课程将通过一系列性能测试实验,验证不同 HTTP/2 流控参数组合对多租户故障域隔离效果的影响。实验将围绕以下三个核心指标展开:
- 故障隔离度: 当某个租户的流被反压时,其他租户的流是否仍能正常完成请求。
- 资源公平性: 在共享连接上,各租户是否获得与其权重匹配的带宽和延迟表现。
- 系统吞吐量: 在保证隔离的前提下,整体吞吐是否仍能接近最优值。
测试将使用 h2load 和自定义 Envoy 配置,模拟多租户并发场景,逐步调整参数并观察故障域变化。