首页 > 解决方案 > 网络故障后进程保留在 RabbitMQ 服务器消费者列表中

问题描述

我正在尝试模拟连接到消息队列的场景,然后在网络故障(在我的情况下与 VPN 断开连接)之后,我的进程尝试在无限循环中重新连接到消息队列。

这是我的代码,似乎正在按照我的意图工作,但问题是,在与 VPN 断开连接后,此过程仍保留在“my_queue”上的消费者列表中,并且在重新连接到 VPN 时,会创建一个新的消费者,因此他们会堆积向上。我怎样才能防止这种情况发生?

import pika
import time

def callback(ch, method, properties, body):
    print("Message received.")

while True:
    try:            
        cred = pika.PlainCredentials('my_user', 'my_pass')
        connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.10.171', port=5672, virtual_host='/', credentials=cred, heartbeat_interval=20, socket_timeout=1))
        channel = connection.channel()
        channel.queue_declare(queue='my_queue', durable=True)
        channel.basic_consume(callback, queue='my_queue', no_ack=True)
        print('Connected.')
        channel.start_consuming()
    except:
        print('Lost connection.')
        time.sleep(2)

这是它在服务器上的样子。只有最后一个消费者实际上是活跃的,但消息正在分发给每个消费者。 'my_queue' 上的消费者列表

标签: rabbitmqpika

解决方案


问题是服务器上的心跳间隔设置为零,因此未检测到不活动的消费者。我使用的是鼠兔 0.11.0 版。这似乎从服务器端提出了心跳建议。


推荐阅读