繁体   English   中英

如何使用 pika 和 rabbitmq 禁用心跳

[英]How to disable heartbeats with pika and rabbitmq

我正在使用 rabbitmq 来促进从我的兔子服务器到我各自的消费者的一些任务。 我注意到当我运行一些相当长的测试时,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调用。

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

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


注意: RabbitMQ 团队会监控rabbitmq-users邮件列表,并且只是偶尔在 StackOverflow 上回答问题。

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

您可以在 pika 文档中看到一个示例。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM