Prhub

#24329 fix(router): make HTTP pool idle timeout configurable

原始 PR 作者 revanthreddy-hai 合并时间 2026-05-07 13:11 文件变更 7 提交数 2 评论 3 代码增减 +82 / -2

执行摘要

使上游 HTTP 连接池空闲超时可配置,默认 50 秒

根据 PR 描述,此变更旨在让 SGLang Model Gateway 的上游 HTTP 连接池空闲超时可配置,以便运维人员可以将其与部署环境中的 keep-alive / idle-timeout 设置对齐(如 sglang workers、ingress-nginx、Envoy/Istio/K-gateway、ALB 或其他网关)。原本超时硬编码为50秒,无法在部分基础设施中进行调整。

本 PR 属于中等价值的改进,建议部署 SGLang Model Gateway 的团队关注并更新配置。对于开发者,可以借鉴其从常量定义到运行时消费的完整配置链路模式,以及同步更新多份文档的良好实践。不涉及复杂逻辑,无需深入代码审查。

讨论亮点

Review 中 gemini-code-assist[bot] 建议将魔法数字 50 抽取为公共常量,以便在 types.rs 和 main.rs 中复用。作者采纳建议,在 types.rs 定义 DEFAULT_POOL_IDLE_TIMEOUT_SECS,在 main.rs 引用该常量,保持了默认值单一来源。该建议已解决。评审人 Kangyan-Zhou 最终批准 PR。

实现拆解

  1. 在 sgl-model-gateway/src/config/types.rs 中新增 DEFAULT_POOL_IDLE_TIMEOUT_SECS 常量和 default_pool_idle_timeout_secs() 默认值函数,为 RouterConfig 新增 pool_idle_timeout_secs 字段并标注 #[serde(default)]。同时添加单元测试验证反序列化默认值正确性。
  2. 在 sgl-model-gateway/src/config/builder.rs 中为 RouterConfigBuilder 增加 pool_idle_timeout_secs() 构建方法。
  3. 在 sgl-model-gateway/src/main.rs 的 CLI 参数中新增 --pool-idle-timeout-secs,默认值使用 DEFAULT_POOL_IDLE_TIMEOUT_SECS 常量,并传递给 builder。
  4. 在 sgl-model-gateway/src/app_context.rs 的 reqwest client 构建处,将硬编码的 Duration::from_secs(50) 替换为 config.pool_idle_timeout_secs。
  5. 更新两份文档(docs_new/docs/advanced_features/sgl_model_gateway.mdx 和 docs/advanced_features/sgl_model_gateway.md)以及 sgl-model-gateway/README.md,新增 HTTP Client Pool 配置项表格。
文件 模块 状态 重要度
sgl-model-gateway/src/config/types.rs 配置类型 modified 7.37
sgl-model-gateway/src/config/builder.rs 配置构建器 modified 6.21
sgl-model-gateway/src/main.rs 入口点 modified 6.05
sgl-model-gateway/src/app_context.rs 应用上下文 modified 4.89
docs_new/docs/advanced_features/sgl_model_gateway.mdx 文档新版 modified 3.86
docs/advanced_features/sgl_model_gateway.md 文档旧版 modified 2.52
sgl-model-gateway/README.md 项目说明 modified 1.65

关键符号

default_pool_idle_timeout_secs pool_idle_timeout_secs (builder method) test_router_config_pool_idle_timeout_deserialization_default

关键源码片段

sgl-model-gateway/src/config/types.rs data-contract

核心配置类型变更,新增字段、默认值函数和单元测试,是整个配置可配置化的基础。

// 定义包级常量作为默认值唯一来源
pub const DEFAULT_POOL_IDLE_TIMEOUT_SECS: u64 = 50;// RouterConfig 结构体新增字段
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RouterConfig {
    // ... 其他字段 ...
    /// 连接池空闲超时秒数,默认 50 秒
    #[serde(default = "default_pool_idle_timeout_secs")]
    pub pool_idle_timeout_secs: u64,
    // ...
}// 默认值工厂函数
fn default_pool_idle_timeout_secs() -> u64 {
    DEFAULT_POOL_IDLE_TIMEOUT_SECS
}// 测试反序列化默认值
#[test]
fn test_router_config_pool_idle_timeout_deserialization_default() {
    let config = RouterConfig::default();
    let mut json = serde_json::to_value(&config).unwrap();
    json.as_object_mut().unwrap().remove("pool_idle_timeout_secs");
    let deserialized: RouterConfig = serde_json::from_value(json).unwrap();
    assert_eq!(deserialized.pool_idle_timeout_secs, default_pool_idle_timeout_secs());
}
sgl-model-gateway/src/app_context.rs data-contract

运行时消费配置,将参数应用到实际的 HTTP 客户端构建。

fn with_client(mut self, config: &RouterConfig, timeout_secs: u64) -> Result<Self, String> {
    let has_tls_config = /* ... */;    let mut client_builder = Client::builder()
        // 使用配置化的空闲超时,而非硬编码 50
        .pool_idle_timeout(Some(Duration::from_secs(config.pool_idle_timeout_secs)))
        .pool_max_idle_per_host(500)
        .timeout(Duration::from_secs(timeout_secs))
        .connect_timeout(Duration::from_secs(10))
        .tcp_nodelay(true)
        .tcp_keepalive(Some(Duration::from_secs(30)));    // ... TLS 配置 ...
}

评论区精华

抽取魔法数字为公共常量 设计

gemini-code-assist[bot] 建议在 types.rs 中定义 DEFAULT_POOL_IDLE_TIMEOUT_SECS 常量,并在 main.rs 的 CLI 默认值中引用该常量,以避免魔法数字不一致。

结论:作者采纳建议,在 types.rs 中新增常量,main.rs 引用该常量,保持默认值单一来源。 · 已解决

风险与影响

本变更风险较低。所有改动均向后兼容:新字段带 #[serde(default)],未配置时使用默认值50,不改变已有行为。风险主要集中在运维层面:配置值过小可能导致空闲连接提前关闭,增加连接建立延迟;配置值过大可能导致连接池占用过多系统资源。但这些属于常规配置风险,可通过文档提醒避免。无安全影响,无非必要的依赖变更。

影响范围限定在 SGLang Model Gateway 组件。用户层面,运维人员可以通过 CLI 参数或环境变量轻松调整上游连接池空闲超时,以匹配前方负载均衡器或网关的超时阈值,减少因连接断开导致的请求重试和延迟。对于未使用新配置的部署,行为完全不变。团队内部减少了一个硬编码常量,提升了可维护性。

向后兼容 配置依赖

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论