Skip to content

feat: confirm slot degradation with active probe over the slot connection - #108

Merged
nange merged 5 commits into
masterfrom
feat/active-slot-probe
Aug 19, 2026
Merged

feat: confirm slot degradation with active probe over the slot connection#108
nange merged 5 commits into
masterfrom
feat/active-slot-probe

Conversation

@nange

@nange nange commented Aug 19, 2026

Copy link
Copy Markdown
Owner

背景

当前 slot degraded 判定依赖被动采样(每 5s 统计 slot 下载吞吐),存在三类误判:

  1. 源站慢、连接快:目标网站慢导致吞吐低,连接本身健康却被误标 degraded;
  2. 停顿但未关闭的 heavy 流(视频缓冲/下载尾部/keep-alive 挂起)吞吐≈0;
  3. 大下载尾部效应。

方案

服务端新增 GET /v3/probe 端点:返回启动时预生成的 128KB 随机数据(x-es 头携带 master key 派生的能力令牌校验,错误 token 返回 fallback 伪装页,per-IP 限流)。

客户端健康循环中,被动采样只负责「怀疑」:低吞吐持续 3 个周期后对该 slot 发起主动探测——通过该 slot 自己的 HTTP/2 连接下载 128KB 随机数据并计算速度(排除 TTFB,3s 超时):

  • 连续 2 次慢探测(<128KB/s,间隔 ≥15s 冷却)才标记 degraded;
  • 快探测清除怀疑并刷新链路参考速度(全链路拥塞时不误标);
  • 探测不可用(老服务端)自动回退到原有被动逻辑,行为不变。

链路健康门控(RTT)

degraded 检测(怀疑累积、主动探测、空闲 retire)只在链路健康时运行,拥塞时冻结,避免全链路变慢时反复标记→重拨的空转:

  • 纯路径 RTT 测量:RTT 样本不再混入源站时间。主测点取自每个请求的 bootstrap 往返——客户端写完握手记录到服务端响应头到达(服务端在拨号源站之前即提交响应头);探测时补充 TTFB 样本(响应头到首个数据块)。慢源站不再抬高 AvgRTT,也不再压制 degraded 检测;
  • 门控阈值 DegradedMaxRTT = 900ms:路径 RTT 高于该值时冻结怀疑累积与探测、阻止 degraded slot 空闲 retire,链路恢复后自动继续。

变更

  • server/handler/probe.go:/v3/probe 端点(token 校验 + 限流 + 分块下发)
  • transport/http2/probe.go:slotProber 主动探测(同连接测量,四态判定);探测 TTFB 记入路径 RTT
  • transport/http2/lifecycle.go:怀疑→探测确认流程、链路参考规则、回退逻辑、RTT 门控
  • transport/http2/stream.go:bootstrap 往返计时(MarkBootstrapSent + 响应头到达打点),每个请求产生一个纯路径 RTT 样本
  • client/proxy/stream.go:握手记录 flush 后打点;移除混入源站时间的旧 RTT 记录
  • crypto/kdf.go:ProbeToken 派生(HKDF)
  • stats:slot_probes / slot_probe_slow / slot_probe_unsupported / server_probes
  • 测试:handler 单测、客户端探测端到端测试、lifecycle 状态机测试、RTT 打点测试

兼容性

场景 行为
新客户端 + 老服务端 探测返回 fallback HTML → 自动回退被动逻辑(与旧版一致)
老客户端 + 新服务端 无影响
错误/缺失 token 返回 fallback 伪装页

nange added 5 commits August 19, 2026 15:10
…tion

Passive throughput sampling alone misjudges slow origins and stalled streams as degraded connections. The server now serves a pre-generated random payload at /v3/probe (token-gated via the master key); the client downloads it through the suspected slot's own HTTP/2 connection and only marks the slot degraded after consecutive slow probe verdicts. Older servers keep the legacy passive-only behavior.
@nange
nange merged commit d6afe5a into master Aug 19, 2026
6 checks passed
@nange
nange deleted the feat/active-slot-probe branch August 19, 2026 08:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant