用途:在 Rust Axum 项目中实现或审查 WebSocket 连接,适用于需要服务端实时推送的场景。
主要能力:使用 axum 的 WebSocketUpgrade、Message 与 WS 路由;用 tokio 管理任务与 mpsc/broadcast 通道;用 futures 的 StreamExt/SinkExt 操作 socket;通过 Hub 注册客户端并做 fan-out 广播。需启用 Axum 的 ws feature,并保持项目原有技术栈。
使用方式:在 HTTP handler 中先完成鉴权(Query/Header/Extension 等提取器),再调用 ws.on_upgrade 进入会话;会话内 split 出 sender/receiver,注册到 hub,spawn 写循环,读取直到 Close 或错误。每个连接只保留一个 writer,写入串行化;使用 bounded channel 实现背压,队列满时选择丢弃消息或断开连接;用 tokio::select! 在读取、hub 事件与关闭信号间选择。处理 Message::Ping/Pong/Close,必要时定期发送 ping 保活;消息建议用带 type 判别字段的 JSON(serde),二进制需有明确契约;限制帧大小,并在有风险时按消息/频道重新校验授权。
适用场景:需要真实推送的领域;多租户下按 room 维护订阅映射或每 room 独立广播通道,身份在升级时绑定,不信任客户端传入的 room_id。
限制与注意:升级后不要混入普通 HTTP 响应;浏览器客户端需做 SameOrigin/Origin 检查;多实例部署时进程内 hub 不足,需借助 Redis/NATS 等做横向 fan-out;避免无鉴权升级、无界通道、多任务并发写同一 sink、忽略 Close 导致孤儿任务、对简单 CRUD 滥用 WS、在连接路径上 unwrap。优雅关闭需停止接受升级、通知 hub、向客户端发 Close 并 flush、用 JoinSet 计数直至归零(可设全局超时)。相关技能:axum、tokio、rust-axum-production。