rabbitmq心跳机制与配置
最近,我们有些在阿里云上的应用总是有客户端出现异常和信息推送不及时的情况,检查mq日志,发现高峰期不停的有心跳超时,如下:
=ERROR REPORT==== 21-Dec-2016::12:38:00 === closing AMQP connection <0.909.1> (125.120.15.131:5060 -> 120.27.140.42:5672): Missed heartbeats from client, timeout: 10s =ERROR REPORT==== 21-Dec-2016::12:38:20 === closing AMQP connection <0.898.1> (125.120.15.131:5057 -> 120.27.140.42:5672): Missed heartbeats from client, timeout: 10s
连接的心跳值可通过控制台看到,如下:
特研究了相关机制,默认情况下,在3.5.5版本之前,rabbitmq设置的默认与客户端心跳时间为580秒,之后为60秒,由服务器参数heartbeat_timeout控制(如果时间间隔配置为0,则表示不启用heartbeat检测,所以java客户端默认是有心跳启用的),两者时间会每隔timeout / 2 进行一次心跳互通(称为心跳间隔),一般最低也不建议低于5秒一次,否则网络负载会比较高。
启用心跳检测后,rabbitmq会为每个tcp连接创建两个进程用于心跳检测(这可以通过rabbitmq.log看到每个客户端确实有两个连接,关闭的时候也是成对的方式),一个进程定时检测tcp连接上是否有数据发送(这里的发送是指rabbitmq发送数据给客户端),如果一段时间内没有数据发送给客户端,则发送一个心跳包给客户端,然后循环进行下一次检测;另一个进程定时检测tcp连接上是否有数据的接收,如果一段时间内没有收到任何数据,则判定为心跳超时,最终会关闭tcp连接。另外,rabbitmq的流量控制机制可能会暂停heartbeat检测。
服务端可在可在配置文件rabbitmq.config(3.7.0之后为rabbitmq.conf)中增加配置项{heartbeat,Timeout}进行配置,其中Timeout指定时间间隔,单位为秒。
具体客户端会什么时候发送心跳,不同的客户端实现可能不一样,有些仅在连接空闲的时候发送,有些则定期发送,不可一概而论。
客户端java则为:
ConnectionFactory cf = new ConnectionFactory(); // set the heartbeat timeout to 60 seconds cf.setRequestedHeartbeat(60); // 取min(clientInterval,serverInterval)
.net则为
var cf = new ConnectionFactory(); // set the heartbeat timeout to 60 seconds cf.RequestedHeartbeat = 60;
如果超过2次心跳无响应,则会认为对方不可到达并关闭连接。此时,客户端通常需要重新连接。具体视客户端的不同而不同。
具体可见http://www.rabbitmq.com/heartbeats.html。
在我们的环境中,应该来说负载并不是特别的高,ping 1k的延时基本上都在20ms以内,照理设置10s的心跳间隔足以,为什么还是会出现,还需要trace_on和tcpdump看下详细的网络包情况。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!