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
ナキウサギではなく、昆布を使用していますが、原則は適用できます。このdrain_events
メソッドは、メッセージ消費の中核です。つまり、メッセージを受信し、メッセージを処理するためにコールバックを実行することを永遠にループします。ここでわかるように、低レベルのソケット ライブラリが 25 秒ごとにタイムアウトします。一部のライブラリでは、モジュール内でクラッシュすることなくこの動作を機能させるために、数行のコードにパッチを当てる必要がありました。
いずれにせよ、hb.beat によって送信されるハートビートはスーパーバイザー プロセスによって監視され、このプロセスは、あまりにも短い期間にあまりにも多くの障害が発生した場合にスクリプトを強制終了します。スクリプトを強制終了した後、スーパーバイザーはスクリプトを再起動します。これは、断続的なネットワーク エラーや MQ ブローカの再起動にうまく対処しています。スクリプトに再接続を行わせることもできましたが、強制終了して再起動する方が簡単でした。