web-dev-qa-db-ja.com

PyMongoがAutoReconnectをスローするのはなぜですか?

私のPython Webアプリケーション(特にMongoDB接続に関する問題)に関するいくつかの奇妙な問題を調査しているときに、何かに気づきました 公式のPyMongoドキュメントページで 。私のWebアプリケーションはフラスコですが、これは私が直面している問題に影響を与えるべきではありません。

PyMongoドライバは接続プーリングを実行しますが、接続が古く、再接続が必要な場合にも例外(AutoReconnect)をスローします。

(AutoReconnect例外に関して)次のように述べています。

自動再接続するには、この例外を処理する必要があります。この例外の原因となった操作が必ずしも成功したとは限らないことを認識してください。今後の操作では、データベースへの新しい接続を開こうとします(そして、最初の接続が成功するまで、この例外を発生させ続けます)。

私はこれが実際に絶えず起こることに気づきました(そしてそれはエラーではないようです)。接続は、数分間操作がないように見えた後、MongoDBサーバーによって閉じられ、Webアプリケーションによって再作成する必要があります。

PyMongoドライバーが再接続時にエラーをスローする理由(ドライバーのユーザーが自分で処理する必要がある)が透過的に行われるのではなく、なぜ私が理解していないのか。 (AutoReconnect例外doがスローされるようにユーザーが設定できるオプションもありますが、賢明なデフォルトではありません。これらの例外はまったくスローされず、接続はシームレスに再作成されますか?)

他のデータベースシステムを使用してこの動作に遭遇したことはありません。そのため、少し混乱しています。

また、ローカル開発のMongoDBサーバーに接続するときにWebアプリケーションのMongoDB接続が失敗することはありません(ローカル接続であり、接続がUNIXソケットではなくUNIXソケットを介して行われるという事実と関係があると思います)。ネットワークソケットですが、間違っている可能性があります)。

16
Andrei Bârsan

AutoReconnectを誤解しています。これは、ドライバーがサーバーと通信しようとして(コマンドまたはその他の操作を送信するため)、ネットワーク障害または同様の問題が発生した場合に発生します。例外の名前は、MongoClientの新しいインスタンスを作成する必要がないことを伝えるためのものです。既存のクライアントは、次の場合に自動的に再接続を試みます。アプリケーションは次の操作を試行します。同じ問題が発生した場合、AutoReconnectが再度発生します。

ソケットのタイムアウト(およびAutoReconnectの発生)が発生している理由は、サーバーとアプリケーションの間にロードバランサーがあり、一定期間非アクティブになった後に接続を閉じるためだと思います。たとえば、これはMicrosoftのAzureプラットフォームで、ソケットで13分間アクティビティがない場合に発生するようです。これは、PyMongo2.8で追加されたsocketKeepAliveオプションを使用して修正できる場合があります。また、アプリケーションサーバーのキープアライブ間隔を適切な値に設定する必要があることに注意してください(Linuxのデフォルトは2時間です)。 詳細はこちらをご覧ください。

16
Bernie Hackett