Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44166
  • 博文数量: 9
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-03 07:58
文章分类

全部博文(9)

文章存档

2014年(4)

2013年(5)

我的朋友

分类: 架构设计与优化

2013-12-04 19:34:03

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、为什么应用层心跳要跟业务消息共享同一个网络连接?
不使用同一个连接,心跳机制就没有实际意义

阅读(7256) | 评论(1) | 转发(2) |
给主人留下些什么吧!~~

zw4219612013-12-05 11:30:03

mark