使用场景
网络在很多情况下会失败,有时情况很微妙(比如 丢包率很高)。操作系统检测到 TCP 断开是一个适中的时间(在 Linux 中默认时长是 11 分钟)。AMQP 0-9-1 提供心跳检测功能来确保应用层及时发现中断的连接(或者是完全没有工作的连接)。 心跳检测还能保护连接不会在一段时间内没有活动而被终止。
心跳超时时间
心跳 timeout 值决定了 TCP 相互连接的最大时间,超过这个时间,该连接将被 RabbitMQ 和 客户端当作不可到达。这个值是在 RabbitMQ 服务器和客户端连接的时候协商的。客户端需要配置请求心跳检测。
心跳帧
心跳帧每隔 timeout/2 时间会发送一次。连续两次心跳失败后,连接将会当作不可到达。不同客户端对此的表现不同,但是 TCP 连接都会关闭。当客户端检测到 RabbitMQ 服务节点不可到达,它需要重新发起连接。
任何连接数据交换(例如 协议操作、发布消息、消息确认)都会计入有效的心跳。客户端可能也会发送心跳包,在连接中有其他数据交换,但有些只在需要时发送心跳包。
在客户端设置心跳超时时间
Java 客户端中设置心跳时间
ConnectionFactory cf = new ConnectionFactory();
cf.setRequestedHeartbeat(30);