Prhub

#24330 fix(router): configure HTTP client connection settings

原始 PR 作者 revanthreddy-hai 合并时间 2026-05-08 02:42 文件变更 8 提交数 1 评论 3 代码增减 +137 / -16

执行摘要

使 SGLang Model Gateway 的 HTTP 客户端连接设置可配置

根据 PR 描述,这是 #24329 的后续,目的是将上游 HTTP 客户端其余的连接设置(连接建立超时、空闲连接池大小、TCP keepalive)暴露为可配置项,使运维人员可以在不同部署环境下调整连接行为,而无需修改网关源码。

值得阅读,尤其适合想了解如何为 reqwest HTTP 客户端添加可配置选项的 Rust 开发者。PR 展示了从配置定义、CLI 参数、序列化、构建器、验证到最终使用的完整数据流,设计清晰。

讨论亮点

Gemini Code Assist 建议将 pool_idle_timeout 也一并配置化,但作者回应已在 #24329 中处理,本 PR 有意限定范围。最终评审人未提出异议,PR 合并。

实现拆解

  1. config/types.rs 中定义三个默认常量(DEFAULT_CONNECT_TIMEOUT_SECS: u64 = 10, DEFAULT_POOL_MAX_IDLE_PER_HOST: usize = 500, DEFAULT_TCP_KEEPALIVE_SECS: u64 = 30),在 RouterConfig 结构体中添加三个对应字段,均使用 #[serde(default = "...")] 确保反序列化向后兼容,并实现 Default trait。
  2. config/builder.rs 中为 RouterConfigBuilder 添加三个 builder 方法 connect_timeout_secspool_max_idle_per_hosttcp_keepalive_secs
  3. main.rs 中添加三个 CLI 参数,支持环境变量(SMG_CONNECT_TIMEOUT_SECSSMG_POOL_MAX_IDLE_PER_HOSTSMG_TCP_KEEPALIVE_SECS),并在构建 RouterConfig 时将参数传递给 builder。
  4. config/validation.rs 中增加校验:connect_timeout_secstcp_keepalive_secs 必须大于 0。
  5. app_context.rs 中将 Client::builder() 中的硬编码值替换为配置字段。
  6. 更新 docs_new/docs/advanced_features/sgl_model_gateway.mdxdocs/advanced_features/sgl_model_gateway.md,在 HTTP Client 表格中新增三行说明。
  7. types.rstests 模块中添加单元测试,验证新字段的默认值及反序列化回退。
文件 模块 状态 重要度
sgl-model-gateway/src/config/types.rs 配置层 modified 7.86
sgl-model-gateway/src/config/builder.rs 配置层 modified 6.84
sgl-model-gateway/src/main.rs 入口 modified 5.98
sgl-model-gateway/src/config/validation.rs 配置层 modified 5.47
sgl-model-gateway/src/app_context.rs 应用上下文 modified 4.83
docs_new/docs/advanced_features/sgl_model_gateway.mdx 文档 modified 3.01
docs/advanced_features/sgl_model_gateway.md 文档 modified 2.28
sgl-model-gateway/README.md 文档 modified 1.53

关键符号

default_connect_timeout_secs default_pool_max_idle_per_host default_tcp_keepalive_secs connect_timeout_secs (builder method) pool_max_idle_per_host (builder method) tcp_keepalive_secs (builder method) test_router_config_http_client_deserialization_defaults

关键源码片段

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

核心变更文件:定义新常量、结构体字段、默认值函数和反序列化测试,构成数据契约。

// sgl-model-gateway/src/config/types.rs ( 关键片段 )use serde::{Deserialize, Serialize};// 默认常量:空闲超时 50s(已有),连接超时 10s,每主机最大空闲 500,TCP keepalive 30s
pub const DEFAULT_POOL_IDLE_TIMEOUT_SECS: u64 = 50;
pub const DEFAULT_CONNECT_TIMEOUT_SECS: u64 = 10;
pub const DEFAULT_POOL_MAX_IDLE_PER_HOST: usize = 500;
pub const DEFAULT_TCP_KEEPALIVE_SECS: u64 = 30;/// 主路由配置
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RouterConfig {
    // ... 其他字段 ...
    #[serde(default = "default_pool_idle_timeout_secs")]
    pub pool_idle_timeout_secs: u64,    // 新增三个 HTTP 客户端连接设置,均提供默认值函数
    #[serde(default = "default_connect_timeout_secs")]
    pub connect_timeout_secs: u64,
    #[serde(default = "default_pool_max_idle_per_host")]
    pub pool_max_idle_per_host: usize,
    #[serde(default = "default_tcp_keepalive_secs")]
    pub tcp_keepalive_secs: u64,
    // ...
}// 默认值函数
fn default_connect_timeout_secs() -> u64 { DEFAULT_CONNECT_TIMEOUT_SECS }
fn default_pool_max_idle_per_host() -> usize { DEFAULT_POOL_MAX_IDLE_PER_HOST }
fn default_tcp_keepalive_secs() -> u64 { DEFAULT_TCP_KEEPALIVE_SECS }// 测试:字段未提供时应回退到默认值
#[cfg(test)]
mod tests {
    use super::*;    #[test]
    fn test_router_config_http_client_deserialization_defaults() {
        let config = RouterConfig::default();
        let mut json = serde_json::to_value(&config).unwrap();
        let obj = json.as_object_mut().unwrap();
        // 移除所有 HTTP 客户端相关字段,模拟未提供
        obj.remove("pool_idle_timeout_secs");
        obj.remove("connect_timeout_secs");
        obj.remove("pool_max_idle_per_host");
        obj.remove("tcp_keepalive_secs");
        let deserialized: RouterConfig = serde_json::from_value(json).unwrap();
        // 断言回退到默认值
        assert_eq!(deserialized.connect_timeout_secs, DEFAULT_CONNECT_TIMEOUT_SECS);
        assert_eq!(deserialized.pool_max_idle_per_host, DEFAULT_POOL_MAX_IDLE_PER_HOST);
        assert_eq!(deserialized.tcp_keepalive_secs, DEFAULT_TCP_KEEPALIVE_SECS);
    }
}
sgl-model-gateway/src/main.rs data-contract

添加 CLI 参数和环境变量,透传新配置到 builder。

// sgl-model-gateway/src/main.rs (CLI 参数定义 )
// ==================== HTTP Client ====================
/// 连接池空闲超时(秒)
#[arg(long, env = "SMG_POOL_IDLE_TIMEOUT_SECS", default_value_t = DEFAULT_POOL_IDLE_TIMEOUT_SECS, help_heading = "HTTP Client")]
pool_idle_timeout_secs: u64,/// 新建上游 HTTP 连接超时(秒)
#[arg(long, env = "SMG_CONNECT_TIMEOUT_SECS", default_value_t = DEFAULT_CONNECT_TIMEOUT_SECS, help_heading = "HTTP Client")]
connect_timeout_secs: u64,/// 每主机最大空闲连接数
#[arg(long, env = "SMG_POOL_MAX_IDLE_PER_HOST", default_value_t = DEFAULT_POOL_MAX_IDLE_PER_HOST, help_heading = "HTTP Client")]
pool_max_idle_per_host: usize,/// TCP keepalive 空闲时间(秒)
#[arg(long, env = "SMG_TCP_KEEPALIVE_SECS", default_value_t = DEFAULT_TCP_KEEPALIVE_SECS, help_heading = "HTTP Client")]
tcp_keepalive_secs: u64,

评论区精华

pool_idle_timeout 配置范围 设计

Gemini Code Assist 建议将 pool_idle_timeout 也纳入此 PR 使其可配置,指出当前硬编码 50 秒。

结论:作者回应 pool_idle_timeout 已在 #24329 中处理,本 PR 有意限定范围。评审接受此决定。 · 已解决

风险与影响

风险极低。新增字段均有默认常量,与旧硬编码值一致,完全向后兼容。验证逻辑确保连接超时和 TCP keepalive 不能为 0,避免配置错误。变更集中在 Model Gateway 配置路径,不影响核心推理服务。

仅影响 SGLang Model Gateway 组件。用户可通过 CLI 或环境变量调整 HTTP 客户端连接行为,利于高并发或高延迟部署场景的调优。默认行为不变,现有用户无感知。

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论