MongoDBドライバーは、Mongoクライアントが使用中に発生する可能性のあるさまざまなネットワークタイムアウトエラーを処理するためのいくつかのオプションを提供します。場合によっては、これらのオプションのデフォルト値がユースケースに適合しない可能性があるため、アプリケーションフローでの予期しないハングを回避し、パフォーマンスを向上させるために、さまざまなMongoClientタイムアウトオプションを理解することが重要です。
mongo -serverselection、connection、socketClickのタイムアウトオプションの設定クリックしてツイート抽象レベルでは、MongoClientを使用してリクエストを接続、送信、または受信するたびに、事前定義されたタイムアウトオプションを内部的に使用して、アプリケーションが最初の接続の確立またはサーバーからのリクエストに対する応答を待機する時間を決定します。
一般的なアプリケーションは、ビジネスロジックに基づいてさまざまなデータベースサーバーと対話しています。たとえば、支払い履歴が1つのデータベースクラスターにあり、分析レコードが別のクラスターにある場合があります。デフォルトのタイムアウトは、ネットワークエラーが発生した場合のアプリケーションの動作に大きな影響を与える可能性があります。分析サーバーがダウンしている場合、各操作は失敗する前にデフォルトの30秒待機します(これは希望する場合とそうでない場合があります)。
サーバー選択タイムアウト
サーバー選択タイムアウトは、mongoドライバーが操作対象のサーバーを選択するのを待ってから、あきらめてエラーを発生させるミリ秒数です。
このオプションは、次世代のMongoドライバーの新しいバージョン(Javaのバージョン3.2.x +)で導入されました。操作の種類とユーザー設定ごとに、MongoClientは選択アルゴリズムを使用してサーバーを選択し、操作を実行します。
スタンドアロンサーバーでの書き込み操作の場合、選択されるサーバーは1つだけです。レプリカセットまたはシャードクラスターでは、操作のユーザー設定基準を満たすサーバーが複数存在する可能性があります。
サーバー選択のタイムアウトが発生する可能性のあるシナリオには、ネットワークがダウンしている場合やレプリカセットのプライマリノードに障害が発生している場合などがあります。
Mongoドライバーはサーバー選択タイムアウトのデフォルト値として30秒を使用します 。ユースケースに応じて、このしきい値を増減できます。
接続タイムアウト
接続タイムアウトは、新しい接続の試行が中止されるまでドライバーが待機するミリ秒数です。
サーバーを選択した後、クライアントはサーバーとの接続を確立しようとします。
ネットワークインフラストラクチャとサーバーの負荷によっては、クライアントは接続の確立を待たなければならない場合があります。接続タイムアウトが発生する可能性のあるシナリオ–サーバーのシャットダウン、ネットワークの問題、間違ったIP / DNS、ポート番号など
接続タイムアウトのデフォルト値は、ドライバーのバージョンと言語によって異なります。 Mongo JavaおよびRubyの最新のドライバーバージョンには、接続確立のデフォルトのタイムアウトが10秒ありますが、NodeJsドライバーにはタイムアウトがありません。
タイムアウトが長すぎると、アプリケーションが停止するリスクがあります。タイムアウトが短すぎると、すぐに諦める可能性があります。さまざまな値でテストして、アプリケーションに適したタイムアウトを見つけることをお勧めします。
SocketTimeout
ソケットタイムアウトは、ソケットでの送受信がタイムアウトするまでにかかるミリ秒数です。
サーバーとの接続を確立した後、クライアントはサーバーに要求を送信し、すでに確立されている接続を使用して応答を受信します。内部的には、接続はソケットを使用してクライアント要求を送信し、応答を受信します
Mongo JavaとNodejsドライバーのデフォルトのソケットタイムアウトは0です。これは、基本的にタイムアウトがないことを意味します 。 Rubyは5sソケットタイムアウトを提供しますが。さまざまな操作で操作に時間がかかるため、このタイムアウトに制限を設ける必要はありません。
さらなる調査
MongoClientタイムアウトオプションは、Mongoドライバーのバージョンと言語によって異なります。デフォルトのタイムアウトオプションを理解するには、ドライバーのMongoClientクラスのドキュメントを確認することをお勧めします。以下に、JavaとRubyのタイムアウト構成を説明するためのサンプルコードをいくつか示します。
MongoDBJavaドライバー
List<MongoCredential> creds = new ArrayList<MongoCredential>(); creds.add(MongoCredential.createCredential(username, DBname, password); MongoClientOptions.Builder optionsBuilder = MongoClientOptions.builder(); optionsBuilder.connectTimeout(CONNECTION_TIME_OUT_MS); optionsBuilder.socketTimeout(SOCKET_TIME_OUT_MS); optionsBuilder.serverSelectionTimeout(SERVER_SELECTION_TIMEOUT_MS); MongoClientOptions options = optionsBuilder.build(); Mongo m = new MongoClient(new ServerAddress(server , port), creds, options);
MongoDBNodeJsドライバー
var uri = ‘mongodb://[username:password@]host[:port1]/[database]’; var options = { server: { socketOptions: { socketTimeoutMS: SOCKET_TIME_OUT_MS, connectTimeoutMS: CONNECTION_TIMEOUT_MS } } }; MongoClient.connect(uri, options, function(err, db) { if(!err) { console.log("We are connected"); } });
私たちは何かを逃しましたか?以下のコメントでお気軽にお知らせください。このようなヒントやその他のヒントを最初に受け取るニュースレターに登録することを忘れないでください!