Автоматическое переподключение Rabbitmq pika

У меня есть несколько скриптов, использующих pika.SelectConnection для связи с сервером RabbitMq.

Можно ли как-то заставить эти скрипты автоматически переподключаться к серверу rmq в случае, если сервер вышел из строя, пока скрипт работает?


person Mikhail    schedule 16.01.2012    source источник


Ответы (1)


У меня есть много сценариев, которые используют следующий подход к повторному подключению:

 while True:
     try:
         mqExch.channel.connection.drain_events(timeout=25)
     except socket.timeout:
         hb.beat() # let our supervisor know we are not hung

Это не пищуха, а комбу, тем не менее, принципы можно применить. Метод drain_events является ядром потребления сообщений, т. е. он постоянно получает сообщения и запускает обратный вызов для обработки сообщения. Как вы можете видеть здесь, у меня тайминг низкоуровневой библиотеки сокетов каждые 25 секунд. С некоторыми библиотеками мне пришлось исправить пару строк кода, чтобы это поведение работало без сбоев внутри модуля.

В любом случае пульс, отправляемый hb.beat, отслеживается супервизорным процессом, и этот процесс уничтожит сценарий, если за слишком короткий промежуток времени произойдет слишком много сбоев. После уничтожения скрипта супервизор перезапускает его. Это хорошо сработало при периодически возникающих сетевых ошибках или перезапусках брокера MQ. Хотя я мог бы заставить свой скрипт выполнять повторное подключение, его было проще убить и перезапустить.

person Michael Dillon    schedule 06.02.2012