用途
本技能面向需要构建实时功能的开发者,讲解如何用 WebSocket、Server-Sent Events(SSE)和长轮询实现可靠的实时特性,并覆盖连接管理、基于房间的消息广播、在线状态跟踪等工程细节。
协议选型
技能提供了一张协议对比表,按方向、使用场景和复杂度区分:
- WebSocket:双向,适用于聊天、协作、游戏,复杂度高。
- SSE:服务端到客户端,适用于通知、仪表盘、信息流,复杂度低。
- 长轮询:请求/响应,适用于降级方案、简单更新,复杂度低。
- WebTransport:双向,适用于低延迟、可容忍不可靠传输的场景,复杂度非常高。
并给出决策矩阵:需要双向通信则选 WebSocket;否则若需要低延迟则选 SSE;否则若只是简单更新则选长轮询。
主要能力
WebSocket 服务端(FastAPI)
技能给出基于 FastAPI 的基础实现,使用 ConnectionManager 数据类维护 room → set[WebSocket] 的连接映射,提供 connect、disconnect、broadcast 方法。broadcast 在发送失败时会把对应连接从房间中移除。WebSocket 端点接收房间路径参数,循环接收 JSON 消息并广播,断开时广播 user_left 事件。
认证
示例通过查询参数 token 传入令牌,调用 verify_token 校验;校验失败时以 WS_1008_POLICY_VIOLATION 关闭连接。技能强调应在连接时认证,而不是每条消息都认证。
消息协议
使用 Pydantic 定义 WsMessage,包含 type(枚举:text、presence、typing、system、error、ack)、id(用于确认)、room、data、timestamp 字段。示例展示了客户端发送、服务端确认(ack)和服务端广播三种消息形态。
在线状态跟踪
PresenceTracker 以 room → {user_id: last_seen} 记录心跳时间,get_online 返回超时窗口内仍在线的用户,cleanup_loop 周期性清理过期记录。默认超时 30 秒。
SSE
使用 sse_starlette 的 EventSourceResponse,在生成器中通过 asyncio.Queue 订阅事件总线,逐条产出 event、data、id 字段。客户端用 EventSource 监听 message 与 presence 事件,onerror 中说明会自动携带 Last-Event-ID 头重连。
Redis Pub/Sub 横向扩展
RedisPubSubBridge 通过 redis.asyncio 发布到 ws:{room} 频道,并在订阅循环中把收到的消息交给本地 ConnectionManager 广播,从而支持多实例部署。
重连与可靠性
客户端 ReconnectingWebSocket 类实现指数退避重连:基础延迟 1000ms,最大重试 10 次,延迟上限 30000ms,连接成功后重置重试计数。
OrderedMessageBuffer 通过 seq 序号与缓冲区保证消息顺序,按 last_seq + 1 依次取出可连续的消息。
反模式提醒
技能列出若干常见问题:没有心跳/ ping 会导致陈旧连接占用资源(建议每 30 秒 ping 一次);连接数无上限(应设置每房间、每用户限制);不做认证;同步广播(一个客户端发送失败会阻塞其他客户端);没有重连策略;以及所有场景都用 WebSocket(仅需服务端到客户端时应使用 SSE)。
适用场景
聊天、协作编辑、游戏、通知、仪表盘、信息流等需要实时推送或双向通信的功能。
限制
资料未提供该技能的安装方式、依赖版本、收费信息、平台支持范围或性能基准,这些内容暂未提供。