长连接的心跳及重连设计(上)

简介: 什么场景下需要心跳呢?目前我们接触到的大多是一些基于长连接的应用需要心跳来“保活”。由于在长连接的场景下,客户端和服务端并不是一直处于通信状态,如果双方长期没有沟通则双方都不清楚对方目前的状态;所以需要发送一段很小的报文告诉对方“我还活着”。同时还有另外几个目的:服务端检测到某个客户端迟迟没有心跳过来可以主动关闭通道,让它下线。客户端检测到某个服务端迟迟没有响应心跳也能重连获取一个新的连接。

心跳实现方式


心跳其实有两种实现方式:


  • TCP 协议实现(keepalive 机制)。


  • 应用层自己实现。


由于 TCP 协议过于底层,对于开发者来说维护性、灵活度都比较差同时还依赖于操作系统。


所以我们这里所讨论的都是应用层的实现。



如上图所示,在应用层通常是由客户端发送一个心跳包 ping 到服务端,服务端收到后响应一个 pong 表明双方都活得好好的。


一旦其中一端延迟 N 个时间窗口没有收到消息则进行不同的处理。


客户端自动重连


先拿客户端来说吧,每隔一段时间客户端向服务端发送一个心跳包,同时收到服务端的响应。


常规的实现应当是:


  • 开启一个定时任务,定期发送心跳包。


  • 收到服务端响应后更新本地时间。


  • 再有一个定时任务定期检测这个“本地时间”是否超过阈值。


  • 超过后则认为服务端出现故障,需要重连。


这样确实也能实现心跳,但并不友好。


在正常的客户端和服务端通信的情况下,定时任务依然会发送心跳包;这样就显得没有意义,有些多余。


所以理想的情况应当是客户端收到的写消息空闲时才发送这个心跳包去确认服务端是否健在。


好消息是 Netty 已经为我们考虑到了这点,自带了一个开箱即用的 IdleStateHandler 专门用于心跳处理。


来看看 cim 中的实现:



在 pipeline 中加入了一个 10秒没有收到写消息的 IdleStateHandler,到时他会回调 ChannelInboundHandler 中的 userEventTriggered 方法。



所以一旦写超时就立马向服务端发送一个心跳(做的更完善应当在心跳发送失败后有一定的重试次数);


这样也就只有在空闲时候才会发送心跳包。


但一旦间隔许久没有收到服务端响应进行重连的逻辑应当写在哪里呢?


先来看这个示例:


当收到服务端响应的 pong 消息时,就在当前 Channel 上记录一个时间,也就是说后续可以在定时任务中取出这个时间和当前时间的差额来判断是否超过阈值。


超过则重连。



同时在每次心跳时候都用当前时间和之前服务端响应绑定到 Channel 上的时间相减判断是否需要重连即可。


也就是  heartBeatHandler.process(ctx); 的执行逻辑。


伪代码如下:


@Override
public void process(ChannelHandlerContext ctx) throws Exception {
    long heartBeatTime = appConfiguration.getHeartBeatTime() * 1000;
    Long lastReadTime = NettyAttrUtil.getReaderTime(ctx.channel());
    long now = System.currentTimeMillis();
    if (lastReadTime != null && now - lastReadTime > heartBeatTime){
        reconnect();
    }
}


IdleStateHandler 误区


一切看起来也没毛病,但实际上却没有这样实现重连逻辑。


最主要的问题还是对 IdleStateHandler 理解有误。


我们假设下面的场景:


  1. 客户端通过登录连上了服务端并保持长连接,一切正常的情况下双方各发心跳包保持连接。


  1. 这时服务端突入出现 down 机,那么理想情况下应当是客户端迟迟没有收到服务端的响应从而 userEventTriggered 执行定时任务。


  1. 判断当前时间 - UpdateWriteTime > 阈值 时进行重连。


但却事与愿违,并不会执行 2、3两步。


因为一旦服务端 down 机、或者是与客户端的网络断开则会回调客户端的 channelInactive 事件。


IdleStateHandler 作为一个 ChannelInbound 也重写了 channelInactive() 方法。



这里的 destroy() 方法会把之前开启的定时任务都给取消掉。


所以就不会再有任何的定时任务执行了,也就不会有机会执行这个重连业务。


相关文章
|
3月前
|
人工智能 缓存 自然语言处理
阿里云百炼大模型计费全解析:2026年四种付费模式怎么选最省钱?
阿里云百炼提供四种大模型计费模式:按量付费(新用户赠100万Token/模型)、Token Plan(团队多模态,198元/席/月)、Coding Plan(个人编程,200元/月9万次)和AI节省计划(承诺消费享最高5.3折)。本文详解计费逻辑、适用场景与省钱技巧,助你精准降本。在阿里云百炼官网:https://t.aliyun.com/U/fPVHqY 免费领取千万Tokens
1090 0
|
Linux 应用服务中间件 虚拟化
Linux系列——VMware虚拟机配置端口转发(端口映射),实现远程访问
Linux系列——VMware虚拟机配置端口转发(端口映射),实现远程访问
|
人工智能 自然语言处理 DataWorks
DataWorks AI助理实践:一句话,帮你搞定研发周报!
本文介绍如何用一句指令让DataWorks AI助理自动生成研发周报并推送至钉钉文档。涵盖三大核心步骤:构建工作空间知识库以理解业务语义、授权钉钉文档API、创建自定义SKILL固化流程。全程约1–2分钟,大幅提升周报效率。
632 0
|
5月前
|
存储 运维 监控
终端远程运维与集中管控:从文件分发到实时屏幕墙的技术架构
本文系统阐述终端远程运维从“现场响应”迈向“远程编排”的范式升级,聚焦互成软件五大核心能力:差分/P2P加速的远程文件分发、多模式(交互/旁观/兼容)远程桌面协助、12屏自适应的多屏实时监控、精准送达与闭环追踪的通知推送、基于设备指纹的U盘远程授信管理,并强调安全合规、协同联动与工程落地,助力企业实现终端运维的可控、可视、可溯。(239字)
|
6月前
|
存储 安全 算法
【分布式】分布式一致性协议:2PC/3PC、Paxos、Raft、ZAB 核心原理、区别(2026必考Raft)
本文系统梳理分布式一致性核心理论与四大协议(2PC/3PC、Paxos、Raft、ZAB),聚焦原理、差异及工程实践。重点强化2026年必考的Raft协议——涵盖Leader选举、日志复制、安全性机制、快照与成员变更等核心考点,构建完整、可落地的知识体系。
|
4月前
|
安全 测试技术 API
筑牢云上办公防线:禁用USB网络共享策略的统一部署与技术实现
USB网络共享(如手机USB热点)正成企业安全“暗道”:绕过防火墙、DLP与审计,引发数据泄露与内网入侵。本文剖析其四大风险,指出“禁用所有USB”不可行,提出基于阿里云无影API的精准管控方案——按VID/PID识别并阻断RNDIS/CDC-NCM类设备,保留UKey、打印机等合法外设,实现安全与效率平衡。(239字)
|
6月前
|
数据采集 算法 机器人
机器人训练纯仿真路线实现“零成本学习”,0真机数据,98%成功率!
2026年4月,某企业发布纯仿真训练具身模型,零真机数据实现近100% Zero-shot成功率,首次抓取率达98%。依托高保真仿真器学习物理规律,突破数据采集瓶颈,推动具身智能迈向“模型中心、软件定义、硬件重构”新范式。(239字)
|
6月前
|
人工智能 机器人 视频直播
别再手动画表情包了!AI 一键把照片做成会动的表情包视频
还在为做专属表情包发愁?2026年AI表情包生成API来了!上传一张图,秒变魔性动态表情包——自动人脸检测、智能模板匹配、1秒出片。零剪辑基础,支持自拍/宠物/网图,适配聊天、短视频、直播等多场景。开发者可直接调用,极简接口,高效集成。
937 0
|
6月前
|
人工智能 JSON Shell
AI 电影解说全流程自动化工作流搭建实战:从环境部署到成片输出
内容团队做电影解说的最大瓶颈是流程低效:字幕提取、文案、配音、对齐、合成需频繁切换工具。本文基于 narrator-ai-cli + Whisper + FFmpeg,将全流程自动化封装为可批量调度的脚本,实现从视频输入到成片输出的一键生产。(239字符)
|
人工智能 缓存 JavaScript
通义灵码深度体验:AI编程助手如何提升全栈开发效率
通义灵码是一款强大的AI编程助手,支持从代码补全到智能体自主开发的全流程辅助。在React+Node.js项目中,其实现了100%字段匹配的Mongoose Schema生成;通过`@灵码`指令,30秒内完成天气查询CLI工具开发,包含依赖管理与文档编写。其上下文记忆能力可自动关联模块逻辑,如为商品模型扩展库存校验。集成MCP服务时,不仅生成基础代码,还推荐最佳实践并添加缓存优化。测试显示,其响应速度快、复杂任务准确率高,适合中小型项目快速迭代,初期开发效率提升约40%。尽管存在文档同步延迟和TypeScript支持不足的问题,仍是一款优秀的AI编程伙伴。
926 7

热门文章

最新文章