Web 实时消息推送详解
场景
进度通知、行情或协作编辑都希望服务端主动更新页面,但“实时”可能只要求几秒,也可能要求双向毫秒交互,方案不应一律 WebSocket。
原理
短轮询周期请求,简单但有空转;长轮询保持请求到事件或超时;SSE 基于 HTTP 单向流并原生支持重连;WebSocket 建立全双工长连接;MQTT 以发布订阅和轻量协议适合物联网。连接层之外还需消息路由与状态管理。
设计步骤
先量化延迟、方向、在线连接数和消息频率;单向通知优先评估 SSE,低频兼容场景用长轮询,强双向交互选 WebSocket;设计心跳、重连退避、事件 ID、鉴权续期;集群通过消息总线把事件路由到连接节点。
权衡
长连接降低重复握手,却长期占用文件描述符和内存;WebSocket 灵活但代理、监控和背压更复杂。SSE 文本单向且浏览器连接数受限。保证至少一次投递会产生重复,精确一次通常代价过高。
实践建议
消息携带单调序号或业务幂等键,客户端重连后从游标补偿;慢消费者设置缓冲上限并降级。负载均衡确认超时和连接迁移策略,监控在线数、重连率、积压和端到端延迟。先满足业务时效,再决定是否承担长连接复杂度。
落地检查
上线前还应做一次桌面演练:准备正常、边界、超时、重复与恶意输入,确认系统的返回、日志和指标彼此对应;在预发布环境模拟依赖不可用、进程重启和配置回滚,验证降级路径不会放大故障。上线时采用小流量观察,提前定义停止条件与负责人。稳定后复盘真实数据,删除没有收益的复杂度,并把新发现的约束补进测试、监控和设计记录,使方案能够随业务持续演进,而不是停留在一次性评审结论。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Dai Wei!
评论

