我在 RabbitMQ 和死连接方面遇到了一些问题。我有一个 RabbitMQ 服务器和许多 ec2 实例,它们连接并从该服务器接收消息。问题是,有时当我需要终止 ec2 实例时,它与 RabbitMQ 服务器的连接并未关闭。
因此,我们开始看到未确认的消息永远不会回到就绪状态。我目前的做法是使用 rabbitmqctl 删除这些连接和/或使用我编写的 python 脚本来终止任何空闲时间超过 X 天的连接。
我已经尝试使用 heatrbeat[1] RabbitMQ 选项,但问题仍然存在。我想要做的是自动关闭任何“死”连接(长时间空闲)。
这是我在客户端而不是服务器端设置的吗?
RabbitMQ 是 3.3.4,我们在客户端上使用 py-amqp[2]。
[1]https://www.rabbitmq.com/configure.html [2]https://github.com/celery/py-amqp
答案1
我们看到了类似的问题,并且我们正在使用不支持心跳的 PHP 客户端。
我们的解决方案是在实例终止之前关闭所有消费者进程,这样所有连接都会干净地断开。据我所知,EC2 将尝试关闭,在机器关闭之前您将有一分钟左右的时间。
例子 :
[1]https://unix.stackexchange.com/questions/48973/execute-a-command-before-shutdown