Tutorial · 07

运行时热更新

作为依赖库,除固定协议规范标准外,Zenith 所有运行参数均支持运行时热更新,无需重建服务器。

热更新能力总览

机制热更新内容
L2eBPF config_mapMTU、协议白名单、fail-closed、期望策略
L2XskConfigsocket 收发缓冲(so_rcvbuf/so_sndbuf)、Fill Ring 预填分块
L3每包预算parse_packet_with_budget、传输表容量
L4ForwardConfig并发会话上限、单会话带宽
L7RuntimeConfigWAF、指纹、监听地址、缓存容量、HTTP 各协议参数
L7ProxyConfig20+ 旋钮:转发超时、池、健康阈值

L7 Web 热更新

通过 ProtocolServer::update_runtime(|r| ...) 无锁原子热更新:

hot_reload.rs
server.update_runtime(|r| { // WAF 开关 / 按 host 黑白名单 / 规则集 r.waf_enabled = true; r.set_host_blacklist(&["bad.example.com"]); // 指纹安全 / 限流 / 阻断 r.set_fingerprint_blocklist(&["ja3:..."]); // HTTP 各协议参数 r.http1_max_requests = 10000; r.http1_idle_timeout_ms = 30000; r.http2_max_frame_size = 16384; r.http3_max_field_section = 8192; // 缓存容量 / /metrics 令牌 / 监听地址 r.cache_capacity_bytes = 1 << 30; r.metrics_auth_token = Some(secret); });

L4 转发与代理热更新

forward_and_proxy.rs
// L4 转发:并发上限 / 单会话带宽 server.set_forward_config(ForwardConfig { max_concurrent_sessions: 10000, per_session_bandwidth_bps: 100 * 1000 * 1000, }); // L7 代理:20+ 旋钮 server.set_proxy_config(ProxyConfig { connect_timeout_ms: 5000, // ... }); // 或增量更新 server.update_proxy_config(|p| p.health_threshold = 0.8);
转发超时对既有路由立即生效;连接池 / 健康阈值对新路由生效。

性能设计

  • 热路径零锁:标量一律 AtomicU64 / AtomicBool 单指令原子加载,零锁零竞争。
  • RwLock 按需:host 名单 / 令牌仅启用时才触碰 RwLock。
  • 写操作微秒级:热更新不触碰读热路径,更新对所有 clone 副本立即生效。

固定内容

不可热更新:协议规范常量(头长、帧长、MTU 标准值、QUIC 版本等)与 Worker MAX_BATCH_SIZE(固定栈数组零堆分配优化)不可改。

运行时治理

搭配 zenith-runtime 使用,热更新与运行时治理闭环:

  • 三级 Supervisor(Node → Domain → Queue → Worker),故障隔离 + 指数退避重启。
  • ChangeSet 八态热切换(Prepare → Validate → ResourceProof → Shadow → Activate → Drain → Commit/Rollback),零丢包 A/B 代际切换。
  • AutoOptimizer:基于负载趋势自动调整 QoS 与 worker 数量。
热更新能力已通过 18/18 项测试验证。部署建议见 部署与降级