heartbeat通常用来检测通信的对端是否存活(未正常关闭socket连接而异常crash)。其基本原理是检测对应的socket连接上数据的收发是否正常,如果一段时间内没有收发数据,则向对端发送一个心跳检测包,如果一段时间内没有回应则认为心跳超时,即认为对端可能异常crash了。

rabbitmq也不例外,heatbeat在客户端和服务端之间用于检测对端是否正常,即客户端与服务端之间的tcp链接是否正常。

1. heartbeat检测时间间隔的设置

1). 服务端的设置

heartbeat检测时间间隔可在配置文件rabbitmq.config中增加配置项{heartbeat,Timeout}进行配置,其中Timeout指定时间间隔,单位为秒。

例如:

python rabbitmq心跳包 rabbitmq 心跳 heartbeat_python rabbitmq心跳包

如果没有进行配置,默认的时间间隔为600秒(最新版本3.2.2修改为580秒)

在rabbit.app中有heartbeat的配置项。

2). 客户端的设置

根据AMQP协议,rabbitmq会通过connection.tune信令将heartbeat检测时间间隔告知客户端,客户端可以根据需要重新设置该值,并通过Connection.tune-ok信令将时间间隔再告诉给rabbitmq,rabbitmq会以客户端的时间作为该tcp连接上heartbeat检测的间隔时间。

python rabbitmq心跳包 rabbitmq 心跳 heartbeat_服务端_02

这里要注意的是:如果时间间隔配置为0,则表示不启用heartbeat检测。

C客户端里:

AMQP_CALL amqp_login(amqp_connection_state_t state, char const *vhost,
                     int channel_max, int frame_max, int heartbeat,
                     amqp_sasl_method_enum sasl_method, ...);

参数heartbeat参数表示心跳频率,60则表示每60S发一次心跳包

如果启用了rabbitmq_management的话,从web控制台可以看到客户端的检测的时间间隔。

python rabbitmq心跳包 rabbitmq 心跳 heartbeat_服务端_03