为什么分布式软件一般都使用心跳包而不适用 tcp 的保活机制呢

2020-03-31 17:49:04 +08:00
 jdz
6462 次点击
所在节点    程序员
39 条回复
simonlu9
2020-04-01 09:05:46 +08:00
程序有可能假死状态的,比如发生死锁这样,但是 tcp 连接还是正常,所以要应用层来判断
useben
2020-04-01 09:18:06 +08:00
@pigmen 心跳维持就是你说的, 不过不是另建一个连接,而是就在当前连接,发送心跳包
fancy111
2020-04-01 09:21:55 +08:00
说实话,我都不知道你们在说什么,什么是 TCP 保活?这个词我都没听过。 另外心跳包难道不是发送基于 tcp 的消息吗?
一群人回复的不知所云的东西。
newmlp
2020-04-01 09:23:05 +08:00
因为可能出现,tcp 没断,应用死了
jinsongzhao
2020-04-01 09:41:11 +08:00
@pigmen 链接模式发个 ping 出去,要等对方告诉你是否成功,对方不回就等超时,因此效率很低,你还要加个多线程或异步判断 ping pong 是否卡顿或断了,你还不能广播你的状态,只有被连服务器知道你是不是嗝屁了,或者你连多台服务器,连多少台也很纠结吧
Esen
2020-04-01 09:51:07 +08:00
心跳包可防可控,具有很高的实用价值。
HelloAmadeus
2020-04-01 09:56:11 +08:00
保活是指 TCP 的 KeepAlive ? KeepAlive 一是不是 TCP 标准里的东西, 二是还是太不容易控制了,要改操作系统配置,还会有坑。以前遇到过连接被负载均衡强制关了,没有正常关闭, 也没有发 RST, 发过去的包就直接被吞了,KeepAlive 就不能处理这种情况。
silenzio
2020-04-01 09:58:15 +08:00
心跳是要保证你的应用层没有崩溃, 而不是网络连接没有崩溃
实际情况就是即使你的一些 service 线程崩了, 或者队列阻塞了, tcp 连接还是存活的, 你无法从 tcp 层面上的心跳来确保你的服务是正常的
一个合格的心跳应该在你的应用层, 把你的应用层关键逻辑都走一遍, 对方收到了心跳, 就任务你的主要服务都是正常的, 不用进行错误处理
cortexm3
2020-04-01 10:01:38 +08:00
保活,Tcp 的 keepalive 。需要设置相关的参数,包括探针时间,数量,探针间隔等。
我记得公司(工业领域,非 IT)通信协议的相关文档,其中就有建议在应用层使用心跳机制替代 keepalive 。
abcbuzhiming
2020-04-01 10:03:18 +08:00
tcp 保活,默认 2 小时发 1 次,你用这种,噗。。。
whywhywhy
2020-04-01 10:51:38 +08:00
@abcbuzhiming 哈哈哈,我之前也查到这个,基本没有可靠可颜。。
whywhywhy
2020-04-01 10:54:51 +08:00
@123444a TCP 是目前互联网最为广泛的几个传输协议之一,工作在网络模型的第四层,保活、心跳都是开发者要考虑到的问题,所以……这个属于基础知识了。。
fuis
2020-04-01 11:02:53 +08:00
应用层跟协议层是两回事。TCP 连接可用不意味着应用可用。
presoul
2020-04-01 12:52:33 +08:00
@qiayue 是的
clrss
2020-04-01 13:37:57 +08:00
TCP keepalive 各项参数都能在应用里调, 时间到不是问题.

“当 Send-Q 不为 0 时(见 ss -nat), tcp_keepalive 不会发送 probe 包, 即不会触发 TCP 超时.”

这个问题很大.
snnn
2020-04-01 15:05:36 +08:00
楼上说了这么多,估计 10 里有 9 个都不知道,TCP 可以灾难恢复,拔掉网线再插上一切如旧。TCP 自带的 keepalive 机制会毁掉这个
paoqi2048
2020-04-01 17:49:01 +08:00
你这连接保熟吗?
roundgis
2020-04-01 20:13:06 +08:00
@123444a keep-alive? 这个参数只有一个推荐值,我知道有些嵌入式设备会把它调整为 10 秒用来取代应用层的心跳


不过我个人还是觉得在应用层设置心跳机制更可靠
horkooo
2020-04-02 18:23:05 +08:00
心跳也需要 tcp 连接

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/658025

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX