Overview
このガイドでは、 Rubyドライバーが接続プールを使用してMongoDBデプロイへの接続を管理する方法と、アプリケーションで接続プール設定を構成する方法について学習できます。
接続プールは 、 Rubyドライバーによって維持されるオープンなデータベース接続のキャッシュです。アプリケーションがMongoDBへの接続を要求すると、ドライバーはプールからシームレスに接続を取得し、操作を実行し、再利用するためにプールに接続を返します。
接続プールは、アプリケーションのレイテンシとRubyドライバーによって新しい接続が作成される回数を削減するのに役立ちます。
接続プールの構成
すべての Mongo::Clientインスタンスには、 MongoDBトポロジー内の各サーバーに対する接続プールが組み込まれています。min_pool_size オプションを構成しない場合、接続プールはオンデマンドで接続を開き、アプリケーション内のMongoDBへの同時要求をサポートします。
Mongo::Clientインスタンスでは、次の接続プール設定を指定できます。
設定 | 説明 |
|---|---|
| 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. Setting this option to 0 creates an unlimited connection pool.Default: 100 |
| The maximum number of connections that each pool can establish
concurrently. Default: 2 |
| The minimum number of concurrent connections that the pool maintains. Default: 0 |
| The maximum number of seconds that a connection can remain idle in
the pool. Default: 0 (no limit) |
max_Pool_size
アプリケーションのリクエストをサポートするために必要な接続に加えて、各 Mongo::Clientインスタンスは、サーバーの状態を監視するためにMongoDBトポロジー内のサーバーごとに最大 2 つの接続を開きます。
例、3 ノードのレプリカセットに接続されたクライアントは、6 つのモニタリング接続を開きます。アプリケーションがmax_pool_size のデフォルト設定を使用し、 プライマリ (デフォルト)ノードのみをクエリする場合、接続プールには最大で 106 のオープン接続と 100 接続が存在できます。アプリケーションが 読み込み設定 (read preference)を使用してセカンダリ ノードをクエリする場合、それらの接続プールは増大し、オープン306 モニタリング接続を含む合計接続数が になる可能性があります。
1 つのプロセス内で多数の同時 MongoDB リクエストをサポートするには、 max_pool_sizeを増やすことができます。
次のコードでは、optionsオブジェクトで max_pool_size オプションを指定して、最大接続プールサイズが 200 である Mongo::Clientインスタンスが作成されます。
require 'mongo' uri = "<connection-string>" client = Mongo::Client(uri, { max_pool_size: 200 })
max_connecting
接続プールは接続確立をレート制限します。max_connecting オプションによって、プールが並行して作成できる接続数が決定されます。例、max_connecting の値が 2 の場合、接続を同時にチェックアウトしようとする 3 番目のリクエストは、次のいずれかの場合にのみ成功します。
接続プールは接続の作成を完了し、プール内の接続数は
max_pool_size未満です。既存の接続がプールにチェックバックされます。
次のコードでは、optionsオブジェクトで max_connecting オプションを指定して、プールごとに同時に確立される最大数の 2 接続を持つ Mongo::Clientインスタンスを作成します。
require 'mongo' uri = "<connection-string>" client = Mongo::Client(uri, { max_connecting: 2 })
min_Pool_size
min_pool_size オプションを使用して、各サーバーへの最小接続数を設定できます。ドライバーが、接続プール内に min_pool_size オプションで設定された接続数以上が常に存在するようにします。接続が閉じられ、接続の合計数(使用中とアイドル状態の両方)が最小値を下回ると、ドライバーは最小値に達するまでさらに接続を開きます。
次のコードでは、optionsオブジェクトで min_pool_size オプションを指定して、最小接続プールサイズが 10 である Mongo::Clientインスタンスが作成されます。
require 'mongo' uri = "<connection-string>" client = Mongo::Client(uri, { min_pool_size: 10 })
注意
max_idle_time と min_pool_size を 0 に設定して構成された Mongo::Client は、アクティビティが継続的に低いワークロードに最適です。この構成により、非アクティブな期間中に接続プールは未使用の接続を閉じることができます。
max_idle_time
max_idle_timeオプションを設定することで、プール内で接続がアイドル状態を維持できる最大ミリ秒数を設定できます。 max_idle_timeの接続がアイドル状態になると、接続プールはそれを削除し、置き換えます。 このオプションのデフォルトは0 (制限なし)です。
次のコードでは、optionsオブジェクトで max_idle_time 設定を指定して、最大アイドル時間が 10000 ミリ秒(10 秒)の Mongo::Clientインスタンスを作成します。
require 'mongo' uri = "<connection-string>" client = Mongo::Client(uri, { max_idle_time: 10000 })
接続を閉じる
いずれかのリクエストで Mongo::Client.close() が呼び出されると、 Rubyドライバーは次のアクションを実行します。
接続プール内のすべてのアイドル接続を閉じます
使用中のすべての接続は、プールに返されるときに閉じます
関連する操作が完了した場合にのみ使用中のすべての接続を閉じます
Mongo::Client.close() を呼び出すと、非アクティブな接続のみが閉じられ、実行中の操作は直接終了されません。
注意
Mongo::Client.close() メソッドは既存のセッションとトランザクションを閉じますが、実行中の操作や開いているカーソルの動作に間接的に影響を与える可能性があります。
接続タイムアウトを避ける
接続プールが大きい場合でも、再接続リクエストは必ずしも削減されるわけではありません。次の例シナリオについて考えてみましょう。
アプリケーションの接続プールサイズが 5 接続で、
timeout_msオプションが 5000 ミリ秒に設定されている。操作は平均して 3000 ミリ秒ごとに発生し、再接続リクエストは頻繁に発生します。
各接続は 5000 ミリ秒後にタイムアウトするため、閉じないようにするには、すべての接続が 5000 ミリ秒中に何らかの操作を行う必要があります。
このシナリオでは、各接続は 5000 ミリ秒後にタイムアウトするため、強制終了を回避するにはこのタイムアウト期間内にアクティビティが必要です。ただし、3000 ミリ秒ごとに 1 回のメッセージではすべての接続をアクティブに保つには十分ではなく、複数の接続でタイムアウトが発生します。
過剰な接続タイムアウトを回避するには、max_pool_size オプションを指定してドライバーが接続プール内で維持できる接続の数を減らします。max_pool_size オプションを設定する方法については、このガイドの max_pool_size セクションを参照してください。
API ドキュメント
Rubyドライバーを使用して Mongo::Clientオブジェクトを作成し、オプションを指定する方法の詳細については、Mongo::Client APIドキュメントの「 オプション ハッシュ 」セクションを参照してください。