08 | 智能心跳机制:解决网络的不确定性
该思维导图由 AI 生成,仅供参考
为什么需要心跳机制
- 深入了解
- 翻译
- 解释
- 总结
智能心跳机制在即时通讯场景中扮演着重要角色,通过维护长连接的可用性,提供更实时、可靠的消息传递。文章介绍了心跳检测的几种实现方式,包括TCP Keepalive、应用层心跳及智能心跳。应用层心跳相比TCP Keepalive更能反映应用的可用性,而智能心跳则能根据网络环境自动调整心跳间隔,平衡NAT超时和设备资源节约。总体而言,心跳机制能降低服务端连接维护的开销,支持客户端断线重连,并保持长连接的存活时间更长。这些技术方案有助于优化长连接的维护,提高即时通讯系统的性能和稳定性。
《即时消息技术剖析与实战》,新⼈⾸单¥59
全部留言(29)
- 最新
- 精选
- 王棕生解答问题:如果从实现功能角度看,传输层和应用层的心跳机制没有结合的必要,因为传输层的心跳探测连接可用性,应用层的心跳机制也可以完成探测; 但从debug角度看,应用层的心跳探测机制无法定位是网络的问题还是系统的问题,此时由传输层辅助就非常好,但实现会相对复杂!
作者回复: 是的👍
2019-09-14246 - rfyiamcool能简单说下 二分法来进行心跳探测 的逻辑么?
作者回复: 其实就是下一次动态调整的心跳间隔是:当前已经确认的安全的心跳间隔最大值 和 已经确认的心跳探测过大的最小值 的中间均值。比如上一次心跳间隔是4分钟,而且连续N次都成功ack了,那么当前已经确认的安全的心跳间隔是4分钟,假设已经确认10分钟时心跳间隔过大了,那么下一次调整的心跳就是 4 + 10 / 2 = 7分钟。
2019-10-24211 - 隰有荷看了老师的讲解,在理论上是明白了,但是具体实践上该如何操作?比如:tcp的keepalive该如何通过具体的代码语言去实现。这些具体操作性的知识,不知道本课程后面是否有涉及到?
作者回复: tcp的keepalive开启比较简单,比如netty下可以通过如下代码开启: ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); 另外tcp keepalive的心跳间隔的配置也需要修改一下系统的/etc/sysctl.conf,类似下面: net.ipv4.tcp_keepalive_time=120 net.ipv4.tcp_keepalive_intvl=30 net.ipv4.tcp_keepalive_probes=3
2019-09-209 - newzai智能心跳,采用什么算法逼近或者选择心跳周期?如何感知当前的心跳周期是否太小?因为一旦太大就会导致连接断开
作者回复: 比较常见的有二分法。
2019-09-135 - dongdong请问老师,我这里使用应用层发心跳包,很奇怪在内网测试环境,网页一直不操作都不会断线,但在外网同套代码,不操作1,2个小时后,网页的长链接就会断线,WS脚本重连也连不上,但只要重新刷新页面就可以连上了,这是什么原因?
作者回复: 心跳间隔是多少?外网的中间路由环节和运营商网络都可能在 一个连接一段时间没有数据传输的时候 从NAT表删除这个连接的映射。所以心跳间隔最好不要大于5分钟。
2019-09-163 - 奕我看上图 心跳处理流程,只有客户端当判断连接无效的时候才会进行 连接重连,重连的这个动作服务端不会进行吗? 如果这样的话服务端还要发送心跳消息进行心跳检测做什么呢?服务端是不是可以这样处理,当一段时间没有收到客户端的心跳包的时候就判断与该客户端的心跳连接断开了,直接释放对应的资源不就可以了吗?
作者回复: 服务端不知道客户端的固定连接地址呀,所以重连一般都是由客户端发起。服务端一般不需要发送心跳,是由客户端来发送心跳,服务端一段时间没有收到客户端的心跳包的时候就可以判断连接异常,主动断开等客户端重连上线就可以了。
2019-09-143 - 蛮野服务端在进行推送时候,假设判断用户连接有效,即用户在线,此时推送是同时推与客户端应用保持的长连接和apns等多条通道吗?然后在客户端去重?还是每次只会选择一条通道?
作者回复: 会双推,走APNs不会直接落地app的db,苹果会根据应用在前台还是在后台来决定要不要展示APNs走通知栏的消息。现在也有很多应用支持应用在前台时也展示通知栏的消息,看具体需求。
2019-09-133 - Geek_e7834d看流程图,服务器检查心跳并不是定时的, 而只是推送的时候检测?
作者回复: 具体是哪个图呀,理解不太对,心跳和推送是独立的,并不会在推送的时候进行检测,一般会由独立的定时器来根据一定时间内socket中是否有数据收发来定时触发的。
2019-10-172 - 花指令老师好,我用go的tcpsocket,有一端异常退出时,另一端会触发掉线通知。所以我不明白的是,socket是不是不需要心跳?还是是因为我是在局域网测试,和公网情况不一样?
作者回复: 因为tcp本身是一个虚拟连接,中间链路断开的话另一端是感知不到的,另外,移动运营商的NAT会对一段时间没有数据传输的连接切断,所以对于维护高可用的一条长连接心跳是必不可少的。
2019-09-1652 - 大魔王汪汪老师 客户端或服务端心跳实现是在客户端维持一个轮训服务吗?这样会不会有浪费客户端资源的问题,有没有什么好方法解决轮训定时器这种资源浪费问题
作者回复: 一种方式是客户端采用固定timer来定时发送心跳包,也可以在客户端没有消息收发后的一段时间才可以发送心跳包,这样能节约一些流量。
2019-09-142