websocket是构建实时通知系统的理想选择,因其支持长连接、双向低延迟通信及消息确认;服务端需管理连接与订阅关系,客户端应实现订阅、接收与重连机制,消息设计需轻量可扩展,部署时须配置反向代理、集群与心跳机制。

WebSocket 是构建实时通知系统的理想选择,因为它能维持客户端与服务端之间的长连接,实现双向、低延迟通信。相比轮询或 Server-Sent Events(SSE),它更灵活,支持主动推送和消息确认,适合通知类场景。
服务端:建立 WebSocket 连接并管理客户端
以 Node.js + ws 库为例,服务端需监听连接、存储客户端、广播或定向发送通知:
- 每次新连接时,为客户端分配唯一 ID(如用 UUID 或 session ID),并存入内存 Map 或 Redis 中,便于后续精准推送
- 收到客户端发来的订阅请求(如
{"type":"subscribe","topic":"order_123"}),按 topic 建立映射关系,支持一对多订阅 - 当业务触发通知(如订单状态更新),查出订阅该 topic 的所有连接,逐个调用
ws.send()推送 JSON 消息 - 监听
close和error事件,及时清理失效连接,避免内存泄漏
客户端:连接、订阅与接收通知
前端使用原生 WebSocket API 即可,无需额外框架:
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- 创建连接后,在
onopen回调中立即发送订阅消息,例如ws.send(JSON.stringify({type:'subscribe', topics:['news', 'user_456']})) - 在
onmessage中解析 JSON,区分通知类型(如toast、badge、sound),再调用对应 UI 更新逻辑 - 添加重连机制:监听
onclose,延迟 1–3 秒后尝试重建连接,并重新发送订阅;避免无限重试,建议设置最大重试次数(如 5 次) - 页面卸载前调用
ws.close(),提升资源回收效率
通知内容设计:轻量、可扩展、带上下文
推送的消息体不宜过大,应聚焦关键信息,并保留扩展能力:
- 必含字段:
id(唯一消息 ID,用于去重或幂等处理)、type(如"order_updated")、timestamp(毫秒时间戳) - 可选业务字段:
data对象内嵌精简数据(如{"orderId":"ORD-789","status":"shipped"}),避免传输完整订单对象 - 支持优先级标记(如
"priority":"high"),前端据此决定是否弹窗、震动或绕过静音模式 - 避免敏感信息直推,如用户手机号、支付金额——改用服务端生成脱敏摘要或跳转链接
部署与稳定性要点
上线前需关注几个实际问题:
- 反向代理(如 Nginx)要开启 WebSocket 支持:配置
Upgrade和Connection头,否则连接会被中断 - 单机连接数有限制(默认 Linux 文件描述符限制),高并发时需调整系统参数或引入集群 + Redis 订阅/发布做跨进程消息中转
- 加入简单心跳机制:服务端每 30 秒发
{"type":"ping"},客户端响应{"type":"pong"},超时未响应则断开连接 - 前端记录最后成功接收时间,若长时间无新消息,主动触发一次
reconnect,防止假死连接
不复杂但容易忽略细节,从连接管理到消息语义,每一步都影响通知的实时性和可靠性。










