WebSocket通过全双工通信实现低延迟实时推送,需维护连接列表、心跳保活、统一消息格式、异步处理及Redis扩展。
WebSocket 是全双工通信协议,相比 HTTP 轮询能显著降低延迟和服务器压力。在 Python 中常用 websockets 库(异步)或 Flask-SocketIO(兼容 WSGI,支持多 worker)实现服务端。客户端通过 new WebSocket("ws://...") 建立长连接后,服务端可随时调用 send() 主动推送数据,例如股票行情、IoT 设备状态、聊天消息等。
关键点:
client_id → websocket),避免推送时连接已断开websocket.closed == False 或 try/except 捕获 ConnectionClosed 异常asyncio.gather() 同时触发过多 send 导致缓冲区溢出网络波动、NAT 超时、代理关闭空闲连接等都会导致 WebSocket 表面“还连着”,实则无法收发数据。标准做法是客户端和服务端约定周期*换 ping/pong 帧——websockets 库默认自动处理 pong 响应,但你需要主动发 ping 并监控响应超时。
推荐实现方式:
await websocket.ping()
asyncio.create_task(heartbeat(websocket))),超时未收到 pong 则主动 close 连接onclose 事件,触发重连逻辑实时传输中混传不同类型消息(如通知、指令、心跳回复)容易引发解析错误。建议采用统一消息结构:
{
"type": "data_update",
"id": "msg_abc123",
"timestamp": 1717025489,
"payload": { ... }
}
服务端收到消息后先校验 type 字段再分发,未知类型直接忽略或返回错误帧;关键业务消息可增加 ack_required: true 字段,由客户端回传确认,服务端超时未收则重发(需配合去重 ID)。
注意事项:
loop.run_in_executor 或使用异步驱动try/except 包裹每条消息处理逻辑单机 WebSocket 服务受限于内存和文件描述符数量,通常 3000–5000 并发连接已是常态上限。要支撑更大规模,需引入外部状态协调:
cribe 并转发给本地连接Upgrade 和 Connection 头透传,并设置 proxy_read_timeout 300 防止代理主动断连