我正在使用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分钟的标记开始,我已经进行了大量测试,一切正常,消费者客户端继续等待消息传递。
答案 0 :(得分:3)
请不要禁用心跳。相反,请正确使用Pika。这意味着:
0.12.0
add_callback_threadsafe
方法安排basic_ack
调用。示例代码可在此处找到:link
我是RabbitMQ核心团队的成员,也是Pika的维护者,因此,如果您还有其他疑问或问题,建议您继续关注pika-python
或rabbitmq-users
邮件列表。谢谢!
注意: RabbitMQ团队监视the rabbitmq-users
mailing list,并且有时仅在StackOverflow上回答问题。
答案 1 :(得分:1)
创建connection
时可以设置最小心跳间隔。
您可以在pika documentation中看到一个示例。
我建议不要禁用心跳,因为它可能导致挂起的连接堆积在代理上。我们在生产中遇到了这样的问题。
始终确保连接具有最小的合理心跳。如果心跳间隔需要较长(例如几小时),请确保在应用程序崩溃或退出时关闭连接。这样,您就不会在代理端打开连接。
答案 2 :(得分:0)
正如@Luke 提到的,心跳很有用,但如果您仍然想禁用它们,只需在创建连接时将心跳参数设置为零即可。所以,
connection = pika.BlockingConnection(pika.URLParameters("amqp://user:pass@127.0.0.1?heartbeat=0"))
connection = pika.BlockingConnection(pika.ConnectionParameters(heartbeat=0))