我正在使用 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 上回答问题。
