1、TCP协议自带的心跳keepalive
TCP协议的实现中,有心跳机制的实现
操作:
setsockopt(handle, SOL_SOCKET, SO_KEEPALIVE, aliveValue);
功能:
每隔固定时间发送probe包,等待接收ack
缺点:
1、无法回返应用层,只是应用层在执行socket调用的时候,会返回错误
2、应用层心跳 keepalive
应用系统自己实现的心跳机制
功能:
固定时间间隔向对端发送probe包,等待接收ack
特点:
1、能够判断对端的网络现状:良好连接或者断线
2、能够判断对端应用层运行状况
3、应用层心跳实现要点:
1、心跳发送与业务逻辑同一个线程(实际上,只要心跳发送线程与网络线程是同一个线程,足以满足)
2、心跳发送与业务逻辑同一个网络连接
3、心跳检查的结果应回调给应用层
4、心跳发送的频率应可以设置:在移动端的心跳实现中,心跳频率达到一定程度,会影响终端的耗电量
几个重要问题:
1、为什么分布式系统必须实现应用层的心跳机制,而不使用TCP协议中的keepalive机制?
如上,TCP keepalive机制与应用层keepalive机制的特点决定的
2、发送间隔、检查间隔、超时时长应该设置为多少,才是最合适的?
根据场景不同,指标也不一样。没有固定的数值
如下样本:
发送间隔10,检查间隔1:
发送间隔1,检查间隔10:
发送间隔10,检查间隔10:
发送间隔10,检查间隔20:
发送间隔20, 检查间隔10:
3、为什么应用层心跳不要用单独一个线程来执行?
应用层心跳发送用单一线程,只能反映网络连接的情况,不能够反映发送者当前业务线程的运行情况,如线程阻塞等
但应用层心跳发送也不是一定要与业务逻辑同一个线程,我认为与网络线程在同一个线程即可,但网络线程需有办法知道业务各线程的
4、为什么应用层心跳要跟业务消息共享同一个网络连接?
不使用同一个连接,心跳机制就没有实际意义
转自:http://blog.chinaunix.net/uid-8332744-id-4023796.html