Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Node.js ドライバー
/ /

接続プールによる接続の管理

このガイドでは、 Node.jsドライバーが接続プールを使用してMongoDBデプロイへの接続を管理する方法と、アプリケーションで接続プール設定を構成する方法について学習できます。

接続プールは、 Node.jsドライバーによって維持されるオープンデータベース接続のキャッシュです。アプリケーションがMongoDBへの接続を要求すると、 Node.jsドライバーはプールからシームレスに接続を取得し、操作を実行し、再利用するためにプールに接続を返します。

接続プールは、アプリケーションのレイテンシとNode.jsドライバーによって新しい接続が作成される回数を削減するのに役立ちます。

すべての MongoClientインスタンスには、 MongoDBトポロジー内の各サーバーに対する接続プールが組み込まれています。minPoolSize オプションを構成しない場合、接続プールはオンデマンドでソケットを開き、アプリケーション内のMongoDBへの同時要求をサポートします。

MongoClientインスタンスでは、次の接続プール設定を指定できます。

設定
説明

maxPoolSize

The maximum number of concurrent connections that the pool maintains. If the number of in-use connections to a server reaches the specified value, the next request to that server waits until a connection becomes available.

Default: 100

maxConnecting

The maximum number of connections that each pool can establish concurrently.

minPoolSize

The minimum number of concurrent connections that the pool maintains.

Default: 0

maxIdleTimeMS

The maximum number of milliseconds that a connection can remain idle in the pool.

Default: 0 (no limit)

waitQueueTimeoutMS

The maximum number of milliseconds that a request can wait for a socket to become available.

Default: 0 (no limit)

アプリケーションのリクエストをサポートするために必要なソケットに加えて、各 MongoClientインスタンスは、サーバーの状態を監視するためにMongoDBトポロジー内のサーバーごとに最大 2 つの接続を開きます。

例、3 ノードのレプリカセットに接続されたクライアントは6 つの監視ソケットを開きます。アプリケーションがmaxPoolSize のデフォルト設定を使用し、 プライマリ (デフォルト)ノードのみをクエリする場合、接続プールには最大で 106 個のソケットと 100 接続が存在できます。アプリケーションが読み込み設定 (read preference)を使用してセカンダリ ノードをクエリする場合、それらの接続プールは大きくなり、開いている監視ソケットを含む合計接続数は 306 になる可能性があります。

1 つのプロセス内で多数の同時 MongoDB リクエストをサポートするには、 maxPoolSizeを増やすことができます。

次のコードでは、optionsオブジェクトで maxPoolSize オプションを指定して、最大接続プールサイズが 200 である MongoClientインスタンスが作成されます。

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
maxPoolSize: 200
});

接続プールは接続確立をレート制限します。maxConnecting オプションによって、プールが並行して作成できる接続数が決定されます。例、maxConnecting の値が 2 の場合、接続を同時にチェックアウトしようとする 3 番目のリクエストは、次のいずれかの場合にのみ成功します。

  • 接続プールは接続の作成を完了し、プール内の接続数はmaxPoolSize未満です。

  • 既存の接続がプールにチェックバックされます。

次のコードでは、optionsオブジェクトで maxConnecting オプションを指定して、プールごとに同時に確立される最大数の 2 接続を持つ MongoClientインスタンスを作成します。

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
maxConnecting: 2
});

minPoolSize オプションを使用して、各サーバーへの最小接続数を設定できます。ドライバーが、接続プール内に minPoolSize オプションで設定された接続数以上が常に存在するようにします。ソケットが閉じられ、ソケットの合計数(使用中とアイドル状態の両方)が最小値を下回る場合、最小値に達するまでさらにソケットが開かれます。

次のコードでは、optionsオブジェクトで minPoolSize オプションを指定して、最小接続プール サイズが 10 である MongoClientインスタンスが作成されます。

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
minPoolSize: 10
});

注意

maxIdleTimeMSminPoolSize0 に設定して構成された MongoClient は、アクティビティが継続的に低いワークロードに最適です。この構成により、非アクティブな期間中に接続プールは未使用の接続を閉じることができます。

6.18.0 より前のバージョンでは、非アクティブな期間中に minPoolSize0 に設定されている場合、 Node.jsドライバーはアイドル接続を閉じませんでした。バージョン 6.18.0 以降では、minPoolSize 設定に関係なく、接続プールはアイドル接続を正しく閉じます。

maxIdleTimeMSオプションを設定することで、プール内で接続がアイドル状態を維持できる最大ミリ秒数を設定できます。 maxIdleTimeMSの接続がアイドル状態になると、接続プールはそれを削除し、置き換えます。 このオプションのデフォルトは0 (制限なし)です。

次のコードでは、optionsオブジェクトで maxIdleTimeMS 設定を指定して、最大アイドル時間が 10000 ミリ秒(10 秒)の MongoClientインスタンスを作成します。

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
maxIdleTimeMS: 10000
});

MongoClient は、複数の同時リクエストをサポートします。 プロセスごとにクライアントを作成し、プロセス内のすべての操作で再利用します。 この方法は、リクエストごとにクライアントを作成するよりも効率的です。

ドライバーはソケットが利用可能になるまで待機できるリクエストの数を制限しません。負荷が急増したときにプールのサイズを境界のあるキューに制限するのはアプリケーションの責任です。 リクエストは、 waitQueueTimeoutMSオプションで指定された時間だけ待機します。デフォルトでは0 (制限なし)です。

ソケットを対象にwaitQueueTimeoutMSで定義された時間以上待機するリクエストでは、接続エラーが発生します。 すべての操作を完了することよりも、負荷急増中に操作の継続時間を制限することが重要な場合は、このオプションを使用します。

次のコードでは、待機キューの最大タイムアウトが 10000 ミリ秒(10 秒)である MongoClientインスタンスを、optionsオブジェクトで宣言して作成します。

const { MongoClient } = require('mongodb');
const uri = '<connection-string>';
const client = new MongoClient(uri, {
waitQueueTimeoutMS: 10000
});

いずれかのリクエストで MongoClient.close() が呼び出されると、 Node.jsドライバーは次のアクションを実行します。

  • 接続プール内のすべてのアイドル ソケットを閉じます

  • 使用中のすべてのソケットは、プールに返されるときに閉じます

  • 関連する操作が完了した場合にのみ使用中のすべてのソケットを閉じます

MongoClient.close() を呼び出すと、非アクティブなソケットのみが閉じられ、実行中の操作は直接終了されません。

注意

MongoClient.close() メソッドは既存のセッションとトランザクションを閉じますが、実行中の操作や開いているカーソルの動作に間接的に影響を与える可能性があります。

接続プールが大きい場合でも、再接続リクエストは必ずしも削減されるわけではありません。次の例シナリオについて考えてみましょう。

  • アプリケーションの接続プールサイズが 5 ソケットで、socketTimeoutMS オプションが 5000 ミリ秒に設定されている。

  • 操作は平均して 3000 ミリ秒ごとに発生し、再接続リクエストは頻繁に発生します。

  • 各ソケットは 5000 ミリ秒後にタイムアウトするため、閉じないようにするには、すべてのソケットが 5000 ミリ秒中に何らかの操作を行う必要があります。

このシナリオでは、各ソケットは 5000 ミリ秒後にタイムアウトするため、クローズドを回避するにはこのタイムアウト期間内にアクティビティが必要です。ただし、3000 ミリ秒ごとに 1 回のメッセージではすべてのソケットをアクティブに保つには十分ではなく、複数のソケットでタイムアウトが発生します。

過剰なソケット タイムアウトを回避するには、maxPoolSize オプションを指定してドライバーが接続プール内で維持できる接続の数を減らします。maxPoolSize オプションを設定する方法については、maxPoolSize セクションを参照してください。

Node.jsドライバーを使用して MongoClientオブジェクトを作成し、オプションを指定する方法の詳細については、次のAPIドキュメントを参照してください。

戻る

MongoDB Server実行時間の制限

項目一覧