Rabbitmq pika 自动重连

1 投票
1 回答
2157 浏览
提问于 2025-04-17 10:22

我有一些脚本,它们使用 pika.SelectConnection 来和 RabbitMq 服务器进行通信。

有没有办法让这些脚本在服务器掉线时,自动尝试重新连接到 RabbitMq 服务器呢?这样即使脚本在运行中,服务器出现问题也能自动恢复连接。

1 个回答

1

我有很多脚本,它们用以下方法来重新连接:

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

虽然我不是用的pika,而是Kombu,但这些原理是可以通用的。drain_events这个方法是消息消费的核心,也就是说,它会不停地循环接收消息,并运行一个回调函数来处理这些消息。在这里,你可以看到我使用了低级的socket库,每25秒就会超时一次。对于某些库,我不得不修改几行代码,才能让这个行为正常工作,而不会在模块内部崩溃。

无论如何,hb.beat发送的心跳信号是由一个监控进程来监控的,如果在短时间内出现太多失败,这个进程就会终止脚本。终止脚本后,监控进程会重新启动它。这种方法在处理偶尔的网络错误或消息队列代理重启时效果很好。虽然我可以让我的脚本自己重新连接,但直接杀掉再重启更简单。

撰写回答