私のPython Webアプリケーションには、同じMongoDbサーバーに複数の接続が登録されていますが、異なるデータベースが3つあります。このアプリケーションは、4人のGunicorn社の従業員の下で実行されます。新しいレプリカセットの設定が完了するまでブロックします
私はレプリカセットを使用しています。
プライマリがダウンすると、現在のクエリは失敗し、MongoReplicaSetClient(2.8では同じですが同じです)でリフレッシュがスケジュールされます。次の問合せは、新しいプライマリが時間までに選択され、MonitorThreadがクライアントの接続を更新する情報を取得した場合に成功する可能性があります。
ただし、リフレッシュはこのクライアントにのみ影響します。同じMongoDBサーバーに接続されている他のクライアントは影響を受けません。 これは、各ワーカーが同じMongoDBサーバー上の3つのデータベースに接続されていて、プライマリが失敗したときに3つのデータベースをすべて使用する同じHTTP要求を繰り返すと、接続されたすべてのクライアントを更新するのに不定期な時間がかかることを意味します。各HTTP要求が4人のうちの各ワーカーにラウンドロビンする場合、各Mongoクライアントを更新するための12の要求が必要です。しかし、実際には、リクエストはラウンドロビンにはなりません。
私はプライマリがダウンした場合、self.disconnect
がself.__schedule_refresh
を呼び出すと呼ばれていることがわかりPyMongoコード MongoReplicaSetClient._send_message_with_response
に探しています。このメソッドには、sync
という引数があります。これにより、「リフレッシュが完了するまでブロックする」ことができます。
私の考えは、例外をキャッチして、新しいレプリカセットの設定が行われるまで、障害の発生したプライマリとブロックに接続されているすべてのクライアントで__schedule_refresh(sync=True)
を呼び出してください。したがって、データベースが正常になるまで、HTTP要求は処理されません(結果は500になります)。
しかし、__schedule_refresh
はプライベートメソッドです。また、私はすべてのクライアントでそれを順番に呼び出すのが速いかどうかわかりません - MonitorThread
は間隔で動作します。
おそらくMongoReplicaSetClient.refresh
を使用できます。
アイデアについてどう思いますか?それには欠点がありますか?
実装のお手伝いをしますか?