Overview
このガイドでは、 Goドライバーが接続プールを使用してMongoDBデプロイへの接続を管理する方法と、アプリケーションで接続プール設定を構成する方法について学習できます。
接続プールは、 Goドライバーによって維持されるオープンなデータベース接続のキャッシュです。アプリケーションがMongoDBへの接続を要求すると、 Goドライバーはプールからシームレスに接続を取得し、操作を実行し、再利用するためにプールに接続を返します。
接続プールは、アプリケーションのレイテンシとGoドライバーによって新しい接続が作成される回数を削減するのに役立ちます。
接続プールの作成
すべての Client
インスタンスには、 MongoDBトポロジー内の各サーバーに対する接続プールが組み込まれています。minPoolSize
オプションを構成しない場合、接続プールはオンデマンドでソケットを開きます。これらのソケットは、アプリケーション内で同時MongoDB操作、または goroutine をサポートします。
新しい Client
インスタンスがインスタンス化されると、サーバーの状態を監視するためにMongoDBトポロジー内のサーバーごとに 2 つのソケットが開きます。
例、3 ノードのレプリカセットに接続されたクライアントは6 つの監視ソケットを開きます。アプリケーションがmaxPoolSize
のデフォルト設定を使用し、 プライマリ (デフォルト)ノードのみをクエリする場合、接続プールには最大で 106
個のソケットと 100
接続が存在できます。アプリケーションが読み込み設定 (read preference)を使用してセカンダリ ノードをクエリする場合、それらのプールも大きくなり、合計接続数が 306
になる可能性があります。
効率には、プロセスごとに 1 回クライアントを作成し、すべての操作でそれを再利用します。レイテンシが増加するため、リクエストごとに新しいクライアントを作成することは避けます。
ネットワークエラーによってソケットが閉じ、ソケットの合計数(使用中とアイドル状態の両方)が最小値を下回ると、最小値に達するまでソケットが開きます。
接続プールを構成する
接続プールの設定は、接続文字列を使用するか、options.Client
メソッドを使用して指定できます。
対応する構文を確認するには、Connection String タブまたは ClientOptionsタブを選択します。
以下は、接続プールを構成するために使用できる接続文字列設定です。
設定 | 説明 |
---|---|
| プールで開始されている接続の最大数。接続プールで デフォルト: |
| プールで開始されている接続の最小数。接続プールはこのソケット数で初期化されます。 デフォルト: |
| プールが同時に確立できる接続の最大数。 デフォルト: |
| このオプションはすべてのドライバーでサポートされているわけではありません。 デフォルト: |
| 接続可能になるまでスレッドが待機できる最大待機時間をミリ秒単位で指定します。この定義時間よりも長時間ソケットを待機する操作では、接続エラーが発生します。 Default: |
次の表では、 設定に連鎖させてドライバーの動作を変更できる方法について説明します。
設定 | 説明 |
---|---|
| プールで開始されている接続の最大数。接続プールで構成された最大接続数が開いているときに操作に新しい接続が必要な場合、新しい操作は新しい接続が開くことを待機します。この待機時間を制限するには、単一のタイムアウト設定を使用します。 デフォルト: |
| プールで開始されている接続の最小数。 デフォルト: |
| プールが同時に確立できる接続の最大数。 デフォルト: |
| このオプションはすべてのドライバーでサポートされているわけではありません。 デフォルト: |
例
対応する例を表示するには、Connection String タブまたは ClientOptionsタブを選択します。
接続プールの最適化
接続プールにはレート制限があり、各接続プールはいつでも最大で maxConnecting
の接続のみを並列に作成できます。新しい goroutine は、次の場合に待機を停止します。
既存の goroutine の 1 つが接続の作成を完了するか、既存の接続がプールにチェックバックされます。
接続作成のレート制限により、既存の接続を再利用するドライバーの能力が向上します。
ドライバーはソケットが使用可能になるまで待機できる操作の数を制限しないため、操作キューを管理するのはアプリケーションの責任です。waitQueueTimeoutMS
オプションを定義しない限り、操作は任意の時間待機できます。
ソケットを対象にwaitQueueTimeoutMS
で定義された時間以上待機する操作では、接続エラーが発生します。 すべての操作を完了することよりも、負荷急増中に操作の継続時間を制限することが重要な場合は、このオプションを使用します。
切断
任意の goroutine から Client.Disconnect()
を呼び出すと、ドライバーはすべてのアイドル ソケットを閉じ、プールに返されるすべてのソケットを閉じます。
詳細情報
接続プールの使用の詳細については、サーバー マニュアルの 接続プール に関するドキュメントを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。