Overview
このガイドでは、 Node.jsドライバーが接続プールを使用してMongoDBデプロイへの接続を管理する方法と、アプリケーションで接続プール設定を構成する方法について学習できます。
接続プールは、 Node.jsドライバーによって維持されるオープンデータベース接続のキャッシュです。アプリケーションがMongoDBへの接続を要求すると、 Node.jsドライバーはプールからシームレスに接続を取得し、操作を実行し、再利用するためにプールに接続を返します。
接続プールは、アプリケーションのレイテンシとNode.jsドライバーによって新しい接続が作成される回数を削減するのに役立ちます。
接続プールの構成
すべての MongoClient
インスタンスには、 MongoDBトポロジー内の各サーバーに対する接続プールが組み込まれています。minPoolSize
オプションを構成しない場合、接続プールはオンデマンドでソケットを開き、アプリケーション内のMongoDBへの同時要求をサポートします。
MongoClient
インスタンスでは、次の接続プール設定を指定できます。
設定 | 説明 |
---|---|
| 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 |
| The maximum number of connections that each pool can establish
concurrently. |
| The minimum number of concurrent connections that the pool maintains. Default: 0 |
| The maximum number of milliseconds that a connection can remain idle in
the pool. Default: 0 (no limit) |
| The maximum number of milliseconds that a request can wait for a socket
to become available. Default: 0 (no limit) |
maxPoolSize
アプリケーションのリクエストをサポートするために必要なソケットに加えて、各 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
オプションによって、プールが並行して作成できる接続数が決定されます。例、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
オプションを使用して、各サーバーへの最小接続数を設定できます。ドライバーが、接続プール内に minPoolSize
オプションで設定された接続数以上が常に存在するようにします。ソケットが閉じられ、ソケットの合計数(使用中とアイドル状態の両方)が最小値を下回る場合、最小値に達するまでさらにソケットが開かれます。
次のコードでは、options
オブジェクトで minPoolSize
オプションを指定して、最小接続プール サイズが 10
である MongoClient
インスタンスが作成されます。
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { minPoolSize: 10 });
注意
maxIdleTimeMS
と minPoolSize
を 0
に設定して構成された MongoClient
は、アクティビティが継続的に低いワークロードに最適です。この構成により、非アクティブな期間中に接続プールは未使用の接続を閉じることができます。
6.18.0 より前のバージョンでは、非アクティブな期間中に minPoolSize
が 0
に設定されている場合、 Node.jsドライバーはアイドル接続を閉じませんでした。バージョン 6.18.0 以降では、minPoolSize
設定に関係なく、接続プールはアイドル接続を正しく閉じます。
maxIdleTimeMS
maxIdleTimeMS
オプションを設定することで、プール内で接続がアイドル状態を維持できる最大ミリ秒数を設定できます。 maxIdleTimeMS
の接続がアイドル状態になると、接続プールはそれを削除し、置き換えます。 このオプションのデフォルトは0
(制限なし)です。
次のコードでは、options
オブジェクトで maxIdleTimeMS
設定を指定して、最大アイドル時間が 10000
ミリ秒(10 秒)の MongoClient
インスタンスを作成します。
const { MongoClient } = require('mongodb'); const uri = '<connection-string>'; const client = new MongoClient(uri, { maxIdleTimeMS: 10000 });
waitQueueTimeoutMS
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 セクションを参照してください。
API ドキュメント
Node.jsドライバーを使用して MongoClient
オブジェクトを作成し、オプションを指定する方法の詳細については、次のAPIドキュメントを参照してください。