如何使用 pika 和 rabbitmq 禁用心跳

How to disable heartbeats with pika and rabbitmq

我正在使用 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 分钟开始进行了大量测试,一切都很好,消费者客户端继续等待消息交付。

您可以在创建connection时设置最小心跳间隔。

你可以在鼠兔中看到一个例子documentation

我建议不要禁用心跳,因为它可能会导致挂起的连接堆积在代理上。我们在生产中遇到过这样的问题。

始终确保连接具有最小的合理心跳。如果心跳间隔需要很长(例如几小时),请确保在应用程序崩溃或退出时关闭连接。这样您就不会在代理端打开连接。

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

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

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

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


注意: RabbitMQ 团队监控 the rabbitmq-users mailing list 并且有时只在 Whosebug 上回答问题。

正如@Luke 提到的,心跳很有用,但如果您仍想禁用它们,只需在创建连接时将心跳参数设置为零即可。所以,

  • 对于URL个参数:connection = pika.BlockingConnection(pika.URLParameters("amqp://user:pass@127.0.0.1?heartbeat=0"))
  • 对于连接参数:connection = pika.BlockingConnection(pika.ConnectionParameters(heartbeat=0))