Socket Server - Rust 实时通信服务端
这不是一个只演示“连接成功、收发消息”的聊天室 Demo,而是一套面向真实业务的实时通信底座:既处理长连接和房间广播,也把身份、历史消息、断线恢复、水平扩展与运维观测放进同一套设计里。
项目当前版本为 0.1.0,服务兼容 Socket.IO v4,可用于在线协作、互动直播、客服会话、消息通知等需要低延迟双向通信的场景。
一套服务,两条通道
服务启动后会同时开放两个入口:HTTP API 默认监听 5000 端口,负责账号、房间、历史消息、回放控制与指标;Socket.IO 默认监听 5001 端口,负责在线连接、实时事件与心跳。
两条通道共享同一组业务服务和安全规则:
- PostgreSQL 保存用户、房间、成员关系、消息、刷新令牌和 Socket Key。
- Redis 管理会话与在线状态,并承担限流计数、回放协调和跨节点 Pub/Sub。
- Tokio 驱动连接、后台清理和消息回放等异步任务。
- Axum + socketioxide 分别承载 HTTP 管理面与 Socket.IO 实时面。
这种拆分让常规查询继续使用清晰的 REST 接口,让实时消息走长连接,同时避免维护两套身份与权限逻辑。
从在线消息到断线恢复
项目实现了公开房间、私有房间和一对一会话。客户端加入房间后,消息会先经过身份、成员关系、类型、大小和频率检查,再写入 PostgreSQL,并通过 Socket.IO 广播给在线成员。
一对一消息使用稳定的会话标识聚合同一对用户的消息,多设备会话可以同时收到投递。客户端掉线后,可通过 after_id 游标补拉房间消息或私聊消息,避免把“在线推送成功”误当成可靠交付。
项目还提供了两种容易混淆但用途不同的回放能力:
- 断线补偿按消息 ID 分页返回缺失内容,解决客户端重新上线后的数据缺口。
- 时间轴回放按原消息间隔重新广播,可设置倍速,并支持暂停、继续和停止,适合复盘互动过程;回放消息带有明确标记,且不会再次写入数据库。
跨节点实时链路
单机广播依赖当前进程内的 Socket.IO 房间,多实例部署则通过自研的 Redis 实时事件总线扇出房间消息、私聊、全局通知和凭证撤销事件。每个环境使用独立频道命名空间,减少测试、预发布与生产之间串流的风险。
Redis Pub/Sub 本身是至多一次投递。订阅发生中断并恢复时,服务端会向客户端发送 server_resync_required,提示它通过游标主动拉取缺失消息。这一设计没有掩盖基础设施的交付语义,而是把实时性与可恢复性拆开处理。
时间轴回放的所有权和控制状态也写入 Redis,同一房间不会被多个节点同时启动回放。暂停、继续和停止操作更新共享控制状态,执行任务轮询响应,让不同节点看到一致的回放状态。
安全不是最后再加的中间件
HTTP 与 Socket 连接都支持 JWT;面向受控系统集成时,还可使用数据库管理的 socket_key。Key 只保存 SHA-256 摘要,禁用或删除后会向所有节点广播撤销事件,断开仍在使用该凭证的会话。
项目在服务端重新确定用户身份,不信任请求体里的 user_id。房间更新、删除和时间轴回放由房主或管理员控制;普通用户只能修改自己的有限资料,也只能删除自己发送的消息。密码或账户状态变化会递增 auth_version,使旧 JWT 与旧 Socket 会话立即失效。
其他安全默认值包括:
- bcrypt 密码哈希,并校验成本参数范围。
- JWT 密钥与内部 API 密钥必须独立且不少于 32 个字符。
- 生产环境拒绝通配 CORS 和默认 Redis 频道前缀。
- HTTP 与可写 Socket 事件共享用户级限流;Redis 不可用时降级为本地内存限流。
- Prometheus 指标接口需要内部密钥,避免直接暴露运行信息。
- 历史默认管理员已由数据库迁移禁用,首位管理员必须显式创建。
可观测与运行维护
服务使用结构化 tracing 记录请求与异常,Prometheus 指标覆盖活跃连接、收发消息、消息大小、请求耗时和错误数量。进程支持 Ctrl+C 与 Unix 终止信号下的优雅停机,并定时清理过期消息和刷新令牌。
仓库同时提供 PostgreSQL 迁移、Linux 配置、Nginx 示例、服务控制脚本与便携构建脚本。
自动化验证
在本次整理时,cargo test --locked 的默认测试集通过了 29 项单元测试和 6 项集成测试。测试覆盖配置安全、JWT、密码哈希、权限边界、事件序列化、回放标记、会话解析、房间流程与 Socket 事件等行为。
这个项目解决了什么
Socket Server 最有价值的部分,不是事件数量,而是把实时系统的关键问题放进主链路:身份如何撤销、消息缺口如何恢复、多节点如何广播、权限如何收口、服务如何被观察。
它将实时投递、持久历史、游标补偿、跨节点广播、凭证撤销和运行指标组合成一套完整服务。相比一份只展示 Happy Path 的实时通信示例,这套实现更接近业务系统真正需要的通信基础设施。