我正在使用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
调用。示例代码可以在这里找到:link
我是RabbitMQ核心团队成员和Pika维护者,所以如果您有其他问题或疑问,我建议您跟进pika-python
或rabbitmq-users
邮件列表。谢谢!
注意:RabbitMQ团队监控the rabbitmq-users
mailing list,有时只回答StackOverflow上的问题。
您可以在创建connection
时设置最小心跳间隔。
你可以在pika documentation中看到一个例子。
我建议不要禁用心跳,因为它可能导致挂起连接堆积在代理上。我们在生产中遇到过这样的问题
始终确保连接具有最小的合理心跳。如果心跳间隔需要很长(例如几小时),请确保在应用程序崩溃或退出时关闭连接。这样,您就不会在代理端打开连接。