我是靠谱客的博主 个性灰狼,最近开发中收集的这篇文章主要介绍rabbitmq 心跳机制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

首先上官方说明: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 心跳机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部