Overview
このガイドでは、timeout_ms
オプションを使用してサーバー操作のタイムアウトを設定する方法を説明します。
Rubyドライバーを使用してサーバー操作を実行する場合、サーバーが操作を完了するまでの許可された期間を制限できます。そのためには、クライアント側操作タイムアウト(CST) を指定します。タイムアウトは、サーバーの選択、接続のチェックアウト、サーバー側の実行など、操作を完了するために必要なすべてのステップに適用されます。操作が完了する前にタイムアウトが経過した場合、 Rubyドライバーはタイムアウトの例外を発生させます。
timeout_ms オプション
MongoDBデプロイに接続するときにタイムアウトを指定するには、timeout_ms
接続オプションをミリ秒単位でタイムアウトの長さに設定します。タイムアウト値は、次の方法で指定できます。
timeout_ms
クライアントオプションをMongo::Client
コンストラクターに渡します。timeoutMS
接続文字列オプションを接続文字列のパラメーターとして渡します。
timeout_ms
クライアントオプションまたは timeoutMS
接続文字列オプションを使用して 30 秒のタイムアウトを指定する方法の例を表示するには、次のタブから選択します。
uri = "<connection string>" options = { timeout_ms: 30000 } client = Mongo::Client.new(uri, options)
uri = "mongodb://<hostname>:<port>?timeoutMS=30000" client = Mongo::Client.new(uri)
timeout_ms
オプションを指定すると、ドライバーはサーバー操作ごとに指定されたタイムアウトを自動的に適用します。
注意
timeout_ms
接続オプションは、ほとんどのタイムアウト関連のオプションを統合します。次のタイムアウト オプションは非推奨です。
socket_timeout
wait_queue_timeout
wtimeout
max_time_ms
max_commit_time_ms
timeout_ms
接続オプションは、これらの非推奨のタイムアウト オプションよりも優先されます。
タイムアウト継承
timeout_ms
オプションを指定すると、ドライバーは他のRubyドライバー オプションと同じ継承動作に従ってタイムアウトを適用します。以下の表は、各レベルでタイムアウト値がどのように継承されるかを示しています。
レベル | 継承の説明 |
---|---|
操作 | 最も優先順位が高く、他のレベルに設定されている |
トランザクション | セッション、コレクション、データベース、またはクライアントレベルで設定された |
セッション | オプションがそれらのレベルに設定されたオプションによって上書きされない限り、そのセッション内のすべてのトランザクションと操作に適用されます。 |
Database | オプションがそれらのレベルに設定されたオプションによって上書きされない限り、そのデータベース内のすべてのセッションと操作に適用されます。 |
コレクション | オプションがそれらのレベルに設定されたオプションによって上書きされない限り、そのコレクションに対するすべてのセッションと操作に適用されます。 |
クライアント |
|
タイムアウト オプションの無効化とその他のオプションの設定の詳細については、次の [ オーバーライド ] セクションを参照してください。
の上書き
操作レベルで timeout_ms
オプションを指定すると、特定の操作のクライアントレベル構成を上書きできます。 これにより、個々のクエリのニーズに基づいてタイムアウトをカスタマイズできます。
次の例は、操作レベルの timeout_ms
構成がクライアントレベルの timeout_ms
構成を無効にする方法を示しています。
require 'mongo' # Replace the placeholder with your connection string uri = "<connection string>" # Sets a client-level timeout configuration options = { timeout_ms: 30000 } Mongo::Client.new(uri, options) do |client| db = client.use('test-db') collection = db[:test-collection] # Performs a query with an operation-level timeout configuration, # overriding the client-level configuration docs = collection.find({}, timeout_ms: 10000).to_a docs.each { |doc| puts doc } end
トランザクション
default_timeout_ms
クライアントオプションを使用して、トランザクションのタイムアウトを設定できます。
トランザクションを実装するための新しい Mongo::Session
インスタンスを作成する場合、default_timeout_ms
クライアントオプションを設定して、次のメソッドの timeout_ms
値を指定できます。
default_timeout_ms
を指定しない場合、ドライバーは親の Mongo::Client
に設定された timeout_ms
値を使用します。
start_session
の呼び出しでは、Mongo::Client
の timeout_ms
値を上書きすることはできません。
start_transaction メソッドのタイムアウト値は、timeout_ms
オプションを使用することでのみ設定できます。
with_transaction
コールバックによって提供されるトランザクション セッションの操作に timeout_ms
オプションを設定して、default_timeout_ms
を上書きすることはできません。そうしないと、ドライバーがエラーをスローします。
クライアントの暗号化
クライアント側フィールドレベル暗号化(CSFLE)を使用する場合、ドライバーは timeout_ms
オプションを使用して暗号化と復号化操作に許可される時間を制限します。
ClientEncryption
インスタンス を構築するときに timeout_ms
オプションを指定すると、そのインスタンスで実行されるすべての操作の有効期間が制御されます。 timeout_ms
を指定しない場合、インスタンスはClientEncryption
コンストラクターで使用される Mongo::Client
から timeout_ms
設定を継承します。
クライアントと ClientEncryption
の両方で直接 timeout_ms
を設定すると、ClientEncryption
に提供された値が優先されます。
Cursors
カーソルは、CSO 機能を使用する場合に構成可能なタイムアウト設定を提供します。 必要に応じて、カーソルの有効期間またはカーソルの反復モードを構成することで、カーソルの処理を調整できます。 モードを構成するには、timeoutMode
オプションを cursorLifetime
(デフォルトの )または iteration
に設定します。
カーソル有効期間モード
timeout_ms
カーソル有効モードでは、カーソルの有効期間全体が制限されます。このモードでは、カーソルの初期化とカーソル メソッドに対する後続のすべての呼び出しは、timeout_ms
オプションで指定された制限内に完了する必要があります。 すべてのドキュメントはこの制限内で返される必要があります。 停止しない場合、カーソルの有効期限が切れ、タイムアウトのエラーが発生します。
to_a
メソッドまたは close
メソッドを呼び出してカーソルを閉じると、タイムアウトがリセットされ、サーバー側のリソースがクリーンアップされるよう保証されます。
次の例は、 timeout_ms
オプションを設定して、カーソルが初期化され、すべてのドキュメントが 10 秒以内に取得されるようにする方法を示しています。
docs = collection.find({}, timeout_ms:10000).to_a
カーソル反復モード
カーソル反復モードでは、timeout_ms
オプションを使用して各呼び出しが try_next
メソッドに制限されます。タイムアウトは、各呼び出しが完了した後に更新されます。これは、Cappedコレクションや変更ストリームで find
メソッドによって返される追尾可能 (tailable) カーソルなど、すべての追尾可能 (tailable) カーソルのデフォルトモードです。
次のコード例では、反復可能カーソルを使用してサンプルコレクション内のドキュメントを反復処理し、各 映画ドキュメントの title
情報を取得してログに記録します。
cursor = collection.find() cursor.each do |movie| puts movie['title'] end
API ドキュメント
Rubyドライバーでタイムアウトの使用の詳細については、次のAPIドキュメントを参照してください。