Назад | Перейти на главную страницу

RabbitMQ не закрывает мертвые соединения с неподтвержденными сообщениями

У меня проблемы с 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

Мы видели похожие проблемы, и мы используем клиент PHP, который не поддерживает сердцебиение.

Наше решение состоит в том, чтобы завершить работу всех процессов-потребителей до того, как экземпляры будут завершены, чтобы все соединения были полностью отключены. AFAIK EC2 попытается завершить работу, и у вас будет примерно минута, прежде чем машина выключится.

Пример :

[1] https://unix.stackexchange.com/questions/48973/execute-a-command-before-shutdown