概述
首先上官方说明:https://www.rabbitmq.com/heartbeats.html
从官方文档可以看到有个heartbeat timeout,服务端默认60s,这里的描述可能有些迷惑性
那么问题来了,如果客户端heartbeat timeout协商的是30s,那么服务端多久会超时断开tcp连接?
经测试,是60-90s,即2-3倍timeout。为什么上面说了15s发一次心跳,丢两次心跳认为不可达,最后却需要这么长时间?
实际上服务端在和客户端协商好heartbeat timeout后,服务端会启动两个进程:一个负责以heartbeat timeout /2的间隔定期判断有没有数据发送,一个以heartbeat timeout 的间隔定期判断有没有收到数据。这点可以从服务端源码看到:
ps:对于rabbitmq-c client,heartbeat参数实际上就是heartbeat timeout。
我们来梳理一下,首先要知道rabbitmq的心跳不是发送、确认这样的机制,不存在序号上成对的心跳。服务端判断超时只看有没有收到数据(心跳包、消息、消息确认都算数据变化,决定服务端超时断开连接的只有心跳接收定时任务。从上面的源码可以看到,将定时任务间隔设为TimeoutSec,会在2-3个TimeoutSec后超时,举个例子:
1.假定客户端设置heartbeat设置是30s,那么上图中服务端TimeoutSec也为30(这个是确定的,日志直接打印这个变量出来就是30)。
2.服务端心跳发送定时器的时间间隔是1/2TimeoutSec,也就是15s,心跳接收定时器是TimeoutSec,30s
3.心跳发送定时任务逻辑:15秒后如果发送状态没有变化,则进入超时处理逻辑,向客户端发送一次心跳包;
4.心跳接收定时任务逻辑:30s后如果接收状态和上次相比没有变化,则计数值加1,再过30s,如果还是没有变化进入超时处理,告知父进程已超时,断开tcp连接
rabbitmq-c客户端原始版本里,默认是按heartbeat,也就是至少30s有一次数据发送;同样,接收超时也是按照heartbeat,30s未收到数据认为超时。
心跳发给服务端的时间间隔千奇百怪,但至少不会超过一个协商的heartbeat;客户端接收心跳超时由于服务端以heartbeat timeout /2进行发送心跳,因此一般实现为一个heartbeat及以上即可。
最后
以上就是个性灰狼为你收集整理的rabbitmq 心跳机制的全部内容,希望文章能够帮你解决rabbitmq 心跳机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复