问题环境
openstack newton版本
rabbitmq 3.6.5
pika 0.10.0
问题现象
rabbimq日志报错信息:”Missed heartbeats from client, timeout: 60s”
问题分析
rabbitmq使用心跳机制来保持连接,在正常场景下,客户端通过发送心跳包来告知服务端自己存活。如果服务端连续两次(间隔heartbeat/2)发送心跳客户端均无回应,服务端会断开与客户端的连接,这也就是rabbitmq日志报错的原因。
对客户端来说,需要在心跳超时时间内向服务端发送信息以完成心跳,然而python与rabbitmq的通讯模块pika.BlockingConnection不支持在执行回调任务时,并行发送心跳包,一旦耗时任务超过heartbeat timeout(默认60s),服务端就会认为连接丢失而主动断开连接,客户端只在完成耗时任务继续使用这个队列的时候才会发现已断开。
相关配置
服务端配置,/etc/rabbitmq/rabbitmq.conf
# heartbeat: 心跳超时判定时间(s)
{rabbit,{heartbeat, 60}}
客户端配置
import pika
# heartbeat_interval: 心跳超时判定时间
parameters = pika.ConnectionParameters('host', 'port', heartbeat_interval=10)
connection = pika.BlockingConnection(parameters)
channel