RabbitMQ实例提供了心跳功能,以确保应用程序层及时发现中断的连接和完全无响应的对端。心跳还可以防止某些网络设备在一段时间内由于没有活动而中断TCP连接。
心跳超时时间
心跳超时时间定义了对等TCP连接在多长时间后被服务端和客户端视为关闭。
在RabbitMQ服务端和客户端分别设置心跳超时时间,服务端和客户端会对配置的心跳超时时间进行协商,客户端必须配置该值来发送心跳。RabbitMQ官方团队维护的3个客户端(Java、.NET、Erlang语言)的心跳超时时间协商逻辑如下:
- 服务端和客户端设置的心跳超时时间都不为0时,两者间较小的值生效。
- 服务端和客户端任意一端设置的心跳超时时间为0,另一端不为0时,非0的值生效。
- 服务端和客户端的心跳超时时间都设置为0时,表示禁用心跳。
更多关于心跳检测的说明,请参考Detecting Dead TCP Connections with Heartbeats and TCP Keepalives。
心跳帧
心跳帧发送时间间隔为心跳超时时间/2,该值有时也被称为心跳间隔。客户端在两次错过心跳后,会被认为是不可达的。不同的客户端会以不同的方式显示这一点,但TCP连接将被关闭。当客户端检测到服务端由于心跳而无法访问时,需要重新连接。
任何流量(如协议操作、消息发布、消息确认、心跳帧等)都会被认为是有效的心跳。如果连接上有其他流量,客户端可以选择发送心跳帧,也可以选择不发送。如果连接上没有其他流量,客户端必须发送心跳帧。
在客户端设置心跳超时时间
如果心跳超时时间设置过低,在短暂的网络拥塞或短暂的服务器流量控制等情况下可能会产生误报。对于大多数环境,超时时间设置为5-20秒最佳。
- 使用Java客户端启动心跳。
在创建连接前使用ConnectionFactory#setRequestedHeartbeat进行设置,示例如下:
ConnectionFactory cf = new ConnectionFactory();
// 将心跳超时时间设置为15秒
cf.setRequestedHeartbeat(15);
- 使用.NET客户端启用心跳。
var cf = new ConnectionFactory();
// 将心跳超时时间设置为15秒
cf.RequestedHeartbeat = TimeSpan.FromSeconds(15);