Reconexão automática Rabbitmq pika
Pergunta
Tenho alguns scripts, usando pika.SelectConnection para me comunicar com o servidor RabbitMq.
Existe alguma maneira de fazer esses scripts tentarem se reconectar automaticamente ao servidor rmq, no caso de o servidor cair, enquanto o script está funcionando?
Solução
Tenho muitos scripts que usam a seguinte abordagem para reconectar:
while True:
try:
mqExch.channel.connection.drain_events(timeout=25)
except socket.timeout:
hb.beat() # let our supervisor know we are not hung
Não é usar pika, mas Kombu, mas os princípios podem ser aplicados.O método drain_events
é o núcleo do consumo de mensagens, ou seja, ele entra em loop para receber mensagens continuamente e executar um retorno de chamada para processar a mensagem.Como você pode ver aqui, a biblioteca de soquetes de baixo nível atinge o tempo limite a cada 25 segundos.Com algumas bibliotecas, tive que corrigir algumas linhas de código para fazer esse comportamento funcionar sem travar dentro do módulo.
Em qualquer caso, a pulsação enviada por hb.beat é monitorada por um processo supervisor e este processo irá matar o script se houver muitas falhas em um intervalo de tempo muito curto.Depois de encerrar o script, o supervisor o reinicia.Isso funcionou bem ao lidar com erros de rede intermitentes ou reinicializações do broker MQ.Embora eu pudesse ter feito meu script reconectar, era mais simples encerrar e reiniciar.