Соединения RabbitMQ не закрываются автоматически при остановке или остановке экземпляров EC2
Я использую python Kombu (3.0.26) с разъемом librabbitmq для подключения к rabbitmq в AWS на экземпляре EC2. Когда я запускаю и останавливаю приложение, соединение с кроликом приходит и уходит, как и ожидалось. Когда я убиваю приложение с помощью TERM или KILL снова, соединение обрывается, как и ожидалось на rabbitmq.
Однако, если я использую консоль AWS, чтобы ОСТАНОВИТЬ или ПРЕКРАТИТЬ экземпляр, соединение будет оставаться на rabbitmq вечно, пока я не войду и не закрою соединение.
Я мог бы решить эту проблему, добавив сердцебиение AMQP к приложению и выяснить, как постоянно пинговать сервер, пока приложение еще живо. Тем не менее, у меня есть некоторые блокирующие вызовы, которые могут преждевременно разорвать соединение, если сердцебиение не связывается вовремя Я бы предпочел, чтобы сервер rabbitmq просто выяснил, что TCP-соединение не работает, и закройте соединение.
У кого-нибудь была проблема с соединениями, зависшими вокруг, когда экземпляр ec2 остановлен или завершен?
1 ответ
Я заметил ту же проблему, когда спотовые инстансы ec2 были отключены в нашем кластере k8s.
kombu 5.2.3
celery 5.2.3
Похоже, что сельдерей создает соединения с сердцебиением amqp для потребителей задач. Однако другие потребители, такие как смешанный потребитель , не имеют сердцебиения.
Существует настройка Broker_heartbeat , но эта установка, похоже, не перенаправляет пульсацию другим потребителям. В конце концов, глубоко внутри комбу есть
Transport
класс с install_connection . Здесь я увидел, что могу просто проксировать через параметры транспорта из настроек, и они существуют на уровне протокола amqp для всех подключений.
# for celery projects
broker_transport_options = {"heartbeat": 40}
# for django + celery projects
CELERY_BROKER_TRANSPORT_OPTIONS = {"heartbeat": 40}
С установленным пульсом, когда узел завершается, все соединения в конечном итоге обрываются с rabbitmq.