我有一些脚本,使用 pika.SelectConnection 与 RabbitMq 服务器通信。
有没有办法让那些脚本尝试自动重新连接到 rmq 服务器,以防服务器出现故障,而脚本工作?
我有很多使用以下方法重新连接的脚本:
while True:
try:
mqExch.channel.connection.drain_events(timeout=25)
except socket.timeout:
hb.beat() # let our supervisor know we are not hung
它不是使用鼠兔,而是使用 Kombu,但是可以应用这些原理。该drain_events
方法是消息消费的核心,即它永远循环接收消息并运行回调来处理消息。正如您在此处看到的,我的低级套接字库每 25 秒超时一次。对于一些库,我必须修补几行代码才能使这种行为正常工作而不会在模块内部崩溃。
在任何情况下,由 hb.beat 发送的心跳都由主管进程监控,如果在太短的时间跨度内出现太多故障,该进程将终止脚本。杀死脚本后,主管重新启动它。这在处理间歇性网络错误或 MQ 代理重新启动时效果很好。虽然我可以让我的脚本重新连接,但杀死和重新启动更简单。