Skip to main content
 首页 » 编程设计

python之如何使用 pika 和 rabbitmq 禁用心跳

2025年05月04日26insus

我正在使用 rabbitmq 来促进从我的 rabbit 服务器到我各自的消费者的一些任务。我注意到,当我运行一些相当长的测试时,超过 20 分钟,我的消费者将在完成任务后与生产者失去联系。在我的兔子日志中,我看到了错误

closing AMQP connection <0.14009.27> (192.168.101.2:64855 ->  
192.168.101.3:5672): 
missed heartbeats from client, timeout: 60s 

此外,我从 pika 收到此错误

pika.exceptions.ConnectionClosed: (-1, "error(10054, 'An existing connection was forcibly closed by the remote host')") 

我假设这是由于这里的代码以及心跳与冗长的阻塞连接时间的冲突。

 self.connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.101.2', 5672, 'user', credentials)) 
    self.channel = self.connection.channel() 
    self.channel.queue_declare(queue=self.tool, 
                               arguments={'x-message-ttl': 1000, 
                                             "x-dead-letter-exchange": "dlx", 
                                             "x-dead-letter-routing-key": "dl", 
                                             'durable': True}) 

是否有适当的方法来增加心跳时间,或者我如何将其完全关闭(这样做是否明智)?就像我说的,超过 20 分钟的测试似乎会导致关闭连接错误,但我从 1-15 分钟开始运行了大量测试,一切都很好,消费者客户端继续等待消息传递。

请您参考如下方法:

请不要禁用心跳。相反,请正确使用 Pika。这意味着:

  • 使用鼠兔版本0.12.0
  • 在单独的线程中执行长时间运行的任务
  • 当您的任务完成时,使用 add_callback_threadsafe 方法安排 basic_ack 调用。

示例代码可以在这里找到:link

我是 RabbitMQ 核心团队成员和 Pika 维护者,所以如果您有进一步的问题或问题,我建议跟进 pika-python或 rabbitmq-users邮件列表。谢谢!


注意: RabbitMQ 团队监控 the rabbitmq-users mailing list并且只是偶尔在 StackOverflow 上回答问题。