告别长连接假死掉线:WebSocket心跳保活、断线重连与消息补偿实践

简介: 记录WebSocket长连接稳定性:ping/pong心跳检测假死、指数退避加随机抖动重连、重连前清理旧连接、按seq消息补偿去重,含弱网切后台5个踩坑案例。

前段时间做一个实时通知功能,用 WebSocket 推送,本地联调一切正常,一到线上就出怪事:连接对象显示还是 OPEN,却半天收不到消息;网络闪断后不会自动恢复,要刷新页面才行;重连太快还会建出多条重复连接。这些都是长连接的典型问题:没有心跳检测假死、没有重连退避、没有消息补偿。补齐之后连接才真正稳下来。这篇把配置过程记下来。

一、先分清:连接断开和连接假死不是一回事

状态 现象 检测方式
真断开 close/error 事件触发 监听事件即可
假死 readyState 仍是 OPEN,但收不到数据 只能靠心跳超时发现
重复连接 存在多条连接、消息收多份 重连前先清理旧连接

NAT 超时、运营商回收、弱网切换都可能让链路悄悄断掉而不触发 close,所以必须靠应用层心跳主动探活。

二、心跳机制:定时发 ping,超时没回就判定断线

心跳配置:
1. 连接成功后启动心跳定时器,每 25 秒发一个 ping
   (间隔要小于 NAT 会话老化时间,常见老化约 60 秒,
   取 20-30 秒留余量)
2. 每发一个 ping 重置等待计时器,
   若 10 秒内没收到 pong,判定假死
3. 收到任何消息(含 pong)都刷新"最后活跃时间"
4. 判定假死后主动 close 当前连接,进入重连流程
5. 页面切到后台可用更小心跳,回到前台立即探一次

踩坑提醒:心跳间隔不是越短越好。间隔过短,连接数一多,心跳包本身就是一笔不小的流量和服务端压力;只要保证小于中间网络设备的会话老化时间即可,25 秒发、10 秒等是比较稳的组合。

三、断线重连:指数退避 + 上限 + 主动清理

重连不能写死固定间隔立刻连,否则服务端抖动时大量客户端同时重连会形成"重连风暴"。

重连状态机:
IDLE -> CONNECTING -> OPEN(心跳启动)
OPEN --超时/断开--> RECONNECTING

重连策略:
1. 指数退避:第 n 次重连等待
   min(1000 * 2^n, 30000),即 1s、2s、4s…
   最长 30 秒,并叠加随机抖动避免齐步走
2. 设置最大重连次数或持续上限,
   超过后提示用户检查网络、提供手动重连
3. 每次重连前先清理:
   旧 ws.close()、清掉心跳和等待定时器,
   保证全局只有一条连接
4. 监听到 open 后重置退避计数,重新启动心跳
5. 页面从后台回前台时,若距上次活跃超时,
   不等定时器直接触发一次重连判断

四、重连后的消息补偿

断线期间服务端可能已经产生了消息,单纯把连接建回来还会漏消息,需要按序号补偿。

消息补偿流程:
1. 每条服务端消息带递增 seq,客户端记录 lastSeq
2. 重连成功后,握手报文带上 lastSeq
3. 服务端推送 lastSeq 之后客户端错过的消息
4. 客户端按 seq 去重、排序后再渲染,
   防止补偿消息和实时消息重复
5. 错过太多(超过缓存窗口)时,
   降级为拉一次全量最新状态

关键是去重:补偿消息和断线前已收到的消息可能有交集,按 seq 用集合去重,保证同一条消息只渲染一次。

五、踩坑清单(这 5 个都实际踩过)

  1. 只监听 close 事件不做心跳,链路假死时 readyState 一直是 OPEN、消息却收不到,加 ping/pong 超时判定后能及时发现
  2. 心跳设成 5 秒一次,上千连接后心跳流量明显,调到 25 秒、小于 NAT 老化时间后压力下降且不掉线
  3. 重连写成立即重连,服务端抖动时形成重连风暴,改指数退避加随机抖动后平滑
  4. 重连前没关旧连接,弱网切换时建出好几条 ws、同一条通知弹多次,重连前统一清理保证单连接
  5. 重连后不补偿,断线期间的消息全部丢失,握手带 lastSeq 拉错过消息并按 seq 去重后不再漏

这个实时通知通道最后部署在乔拓云的轻应用环境里,前端连接管理和推送服务在同一套工程内维护,我主要负责心跳探活、指数退避重连和按序号消息补偿这几块,弱网和切后台场景下连接都能自动恢复且不丢消息。

复盘要点

  1. 假死只能靠应用层心跳发现,心跳间隔小于 NAT 老化时间,发 ping、等 pong、超时即断
  2. 重连用指数退避加随机抖动、设上限,重连前彻底清理旧连接和定时器
  3. 重连后按消息序号补偿并去重,避免断线丢消息和重复渲染

以上是个人实践记录,各平台具体功能以官方实时信息为准。

开放问题:你们做 WebSocket 长连接时,心跳间隔一般设多少?消息补偿是服务端推送离线消息,还是客户端主动拉接口补,哪种更省心?

相关文章
|
1月前
|
人工智能 自然语言处理 API
爆火!新一代e2e AI测试框架,单日狂揽1500 star
GitHub 热门新项目 `e2e`:TesterArmy 开源的 AI 增强型端到端测试框架(Web/移动端),TypeScript 编写,Apache-2.0 协议。创新采用「AI + 代码」混合模式——`agent.act()` 处理动态界面,传统断言保障稳定性;独创回放机制,UI 不变则零模型调用,大幅降本增稳。上线两月获 9000+ Star,npm 周下载 23.8 万。
665 2
爆火!新一代e2e AI测试框架,单日狂揽1500 star
|
7月前
|
SQL 关系型数据库 MySQL
【全网最详细】Navicat下载免费版 | Navicat数据库管理工具安装图解(2026最新)
Navicat是一款专业、直观的数据库管理工具,支持MySQL、PostgreSQL、Oracle等十余种主流数据库。图形化界面替代命令行,轻松实现建表、SQL编写、数据导入导出与同步,大幅提升开发与DBA工作效率。(239字)
28159 132
|
1月前
|
缓存 前端开发 应用服务中间件
浏览器控制台满屏跨域报错:CORS预检、凭证模式与通配符限制的配置记录
前端一夜之间全报CORS跨域。记录如何用Network区分简单请求与OPTIONS预检、Nginx预检响应头配置、带凭证时通配符origin为何被浏览器拒绝,以及Vary:Origin等5个高频坑。
|
1月前
|
域名解析 网络协议 算法
免费SSL证书申请流程:2026年最新阿里云个人测试证书申请与部署全流程
本文详解阿里云“个人测试证书”(原免费SSL证书)申请全流程:含控制台入口、0元申领20张、域名绑定、DNS验证及CA审核,适用于个人项目与测试环境,有效期90天。阿里云SSL官网:https://t.aliyun.com/U/m0alhG
253 0
|
7月前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
52347 73
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
Web App开发 小程序 前端开发
微信小程序自动化测试最佳实践(附 Python 源码)
本文主要分享下微信小程序自动化测试的一些最佳实践心得,包括微信小程序的基本测试技术和操作方法,以及如何利用 Appium 的 WebView 测试技术 + adb proxy 完成微信小程序的自动化测试(可能是目前最实用的小程序自动化测试技术),并附上 Python 版源码。
微信小程序自动化测试最佳实践(附 Python 源码)
|
2月前
|
缓存 开发工具 git
npm 怎么更新 dsh?DeepSeek Harness 的 npm update -g 与 @latest 用法
npm 怎么更新 dsh 要分清三条路:npm update -g 受语义化版本范围限制、install -g @latest 强制装最新、npx 要显式带 @latest 并注意缓存;文末给版本核对与镜像滞后的确认方法。
789 0
|
9月前
|
消息中间件 Java 关系型数据库
吃透 Java 轻量级流程引擎 Easy Work:从核心原理到生产级落地全指南
Easy Work是一款开源轻量级Java流程引擎,基于状态机设计,摒弃BPMN复杂特性,学习成本降90%、性能提升3倍以上,专为中小微流程场景优化,5分钟即可快速集成上线。
1390 2
|
11月前
|
弹性计算
阿里云最便宜云服务器38元一年优惠:配置、价格及购买限制全面指南
阿里云最便宜云服务器多少钱一年?38元一年,配置、价格及购买限制介绍来了,亲身测试是38元一年,价格确实便宜,38元一年相当于3元1个月、一毛钱一天。这是一台轻量应用服务器,200M峰值带宽、2核2G、40G ESSD系统盘,不限流量。
|
开发框架 Java 测试技术
领域驱动设计(DDD)在中小型项目中的落地实践
本文探讨领域驱动设计(DDD)在中小型项目中的落地实践,涵盖核心概念如领域模型、聚合、限界上下文与事件驱动架构,并结合电商订单系统案例,展示分层架构、仓储模式与领域服务的实际应用,助力团队构建高内聚、易维护的业务系统。
2029 10

热门文章

最新文章