RabbitMQ 心跳检测(翻译)

本文探讨了网络连接中TCP断开时的操作系统处理机制,特别是AMQP0-9-1中的心跳检测功能。文章详细介绍了RabbitMQ中心跳超时时间的设置、影响因素以及如何在Java和.NET客户端开启心跳。同时提到了低超时可能导致的误报问题,并强调了心跳检测对避免代理工具关闭连接的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

网络在很多情况下会失败,有时情况很微妙(比如 丢包率很高)。操作系统检测到 TCP 断开是一个适中的时间(在 Linux 中默认时长是 11 分钟)。AMQP 0-9-1 提供心跳检测功能来确保应用层及时发现中断的连接(或者是完全没有工作的连接)。 心跳检测还能保护连接不会在一段时间内没有活动而被终止。

心跳超时间隔

心跳 timeout 值决定了 TCP 相互连接的最大时间,超过这个时间,该连接将被 RabbitMQ 和 客户端当作不可到达。这个值是在 RabbitMQ 服务器和客户端连接的时候协商的。客户端需要配置请求心跳检测。RabbotMQ 3.0 及以上的版本中,RabbitMQ 默认设置与客户端之间的心跳时长为 60 秒(3.5.5 版本之前的默认值为 580)。
心跳帧每隔 timeout/2 时间会发送一次。连续两次心跳失败后,连接将会当作不可到达。不同客户端对此的表现不同,但是 TCP 连接都会关闭。当客户端检测到 RabbitMQ 服务节点不可到达,它需要重新发起连接。
任何连接数据交换(例如 协议操作、发布消息、消息确认)都会计入有效的心跳。客户端可能也会发送心跳包,在连接中有其他数据交换,但有些只在需要时发送心跳包。
可以设置 timeout 为 0 来禁用心跳检测功能。不推荐这么做。

Java 客户端中开启心跳

为了在 Java 客户端设置心跳 timeout 时间,需要在创建连接之前通过 ConnectionFactory#setRequestedHeartbeat 设置 timeout 值:
ConnectionFactory cf = new ConnectionFactory();
// set the heartbeat timeout to 60 seconds
cf.setRequestedHeartbeat(60);
注意,如果 RabbitMQ 服务器配置了非零的心跳 timeout 时间(以 3.6.x 开头的版本都有默认设置),客户端设置的时间智能小于这个时长,而不能大于这个时长。

.Net 客户端中开启心跳

为了在 .NET 客户端设置心跳 timeout 时间,需要在创建连接之前通过 ConnectionFactory.RequestedHeartbeat 设置 timeout 值:
var cf = new ConnectionFactory();
// set the heartbeat timeout to 60 seconds
cf.RequestedHeartbeat = 60;

低超时间隔和误报

设置心跳 timeout 时长过段会导致误报(正常的客户端连接会被误报为不可到达)。可能会因为瞬间的网络拥堵、短暂的服务器流量控制,或者其他原因。在设置 timeout 值时需要考虑这些因素。
用户和客户端包维护者多年的反馈建议。timeout 值小于 5 秒很可能导致误报,小于等于 1 秒更有可能误报,在 5 到 20 之间是大多数环境适合的值。

心跳和 TCP 代理

某些网络工具(HAproxy, AWS ELB)和设备(硬件负载均衡器)可能关闭在一段时间内没有活动的“空闲”连接,大多数时候这是不可取的。
在连接上启动心跳检测后,它会周期的发送网络检测包。因此,它会保护客户端连接不会因为一段时间的空闲,而被代理和负载平衡器关闭连接。
10 到 30 秒的心跳超时时间产生的周期网络流量(大约 5 到 15 秒)能够满足大多数默认设置的代理工具和负载均衡器。

RabbitMQ使用心跳机制来检测客户端与服务器之间的连接状态。当客户端与服务器之间的网络连接断开时,RabbitMQ会通过心跳消息检测到,并且会触发掉线重连的机制。 在 RabbitMQ 中,默认的心跳超时时间为60秒。当客户端在60秒内没有向服务器发送任何消息时,服务器会发送一个心跳消息给客户端,以确认连接是否正常。如果客户端在一定时间内没有收到心跳消息,就会认为与服务器之间的连接已经断开,并触发掉线重连操作。 掉线重连的实现可以通过 RabbitMQ 客户端提供的机制来完成。不同的客户端库可能会有不同的具体实现方式,但一般可以通过以下步骤来实现掉线重连: 1. 监听连接状态:通过注册连接状态的回调函数或者事件处理函数,来监听与 RabbitMQ 服务器之间的连接状态变化。 2. 检测到掉线:当连接状态变为断开状态时,即可判断为掉线。可以通过捕获异常、检查错误码或者其他方式来确认掉线状态。 3. 重连操作:在掉线后,需要重新建立与 RabbitMQ 服务器的连接。可以根据具体需求选择不同的重连策略,比如指数退避重连、固定时间间隔重连等。 4. 恢复消息传递:在重新建立连接后,需要重新订阅队列、重新发送未确认的消息等,以确保消息的可靠传递。 需要注意的是,掉线重连操作可能会对系统的性能产生一定的影响,所以在实际应用中需要根据具体情况权衡是否需要开启掉线重连功能。另外,还应该考虑网络稳定性、服务器负载等因素来优化掉线重连的策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值