heartbeat超时值定义了RabbitMQ及其client库在多久之后认为TCP连接不可到达。这个值是在client连接RabbitMQ服务器的时候协商好的,在RabbitMQ 3.0及以上版本,broker缺省就会自动尝试进行heartbeat协商,而对于低版本则必须由client在连接时显示地请求协商。该值单位为秒,缺省是60秒。
每隔timeout / 2秒发送一个Heartbeat消息帧,这个值有时被称作heartbeat interval,如果连续丢失两个heartbeats消息帧,就认为tcp连接中断了。不同的client表现不同,但是都会关闭tcp连接。当客户端通过heatbeat机制检测到RabbitMQ节点不可到达时,应该尝试重新连接。
不要混淆timeout和interval这两个值,RabbitMQ以及官方提供的client库都使用timeout,而某些client库使用的是interval。
只要链路上有消息在传递,那么就认为是有效的heartbeat,client可以不考虑链路上是否有消息传递就发送heartbeat消息帧,也可以只在必要时才发。
可以把timeout设置成0来禁用heartbeat,但是实践中不建议这么用。
Java代码启用Heartbeat
Java客户端代码中在连接之前,通过调用ConnectionFactory#setRequestedHeartbeat来和服务器协商timeout值。
ConnectionFactory cf = new ConnectionFactory();
// set the heartbeat timeout to 60 seconds
cf.setRequestedHeartbeat(60);
注意:当服务器配置了非0的timeout值情况下,client只能设置比它小的值,不能比它大。
RabbitMQ心跳机制详解
本文详细介绍了RabbitMQ心跳机制的工作原理,包括heartbeat超时值的定义、协商过程及其实现方式。还讨论了如何在Java客户端启用心跳机制,并解释了heartbeat与heartbeatinterval的区别。
2884

被折叠的 条评论
为什么被折叠?



