Docs Menu
Docs Home
/ / /
Ruby ドライバー
/

MongoDB Server実行時間の制限

このガイドでは、timeout_ms オプションを使用してサーバー操作のタイムアウトを設定する方法を説明します。

Rubyドライバーを使用してサーバー操作を実行する場合、サーバーが操作を完了するまでの許可された期間を制限できます。そのためには、クライアント側操作タイムアウト(CST) を指定します。タイムアウトは、サーバーの選択、接続のチェックアウト、サーバー側の実行など、操作を完了するために必要なすべてのステップに適用されます。操作が完了する前にタイムアウトが経過した場合、 Rubyドライバーはタイムアウトの例外を発生させます。

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ドライバー オプションと同じ継承動作に従ってタイムアウトを適用します。以下の表は、各レベルでタイムアウト値がどのように継承されるかを示しています。

レベル
継承の説明

操作

最も優先順位が高く、他のレベルに設定されている timeout_ms オプションを上書きします。

トランザクション

セッション、コレクション、データベース、またはクライアントレベルで設定された timeout_ms よりも優先されます。

セッション

オプションがそれらのレベルに設定されたオプションによって上書きされない限り、そのセッション内のすべてのトランザクションと操作に適用されます。

Database

オプションがそれらのレベルに設定されたオプションによって上書きされない限り、そのデータベース内のすべてのセッションと操作に適用されます。

コレクション

オプションがそれらのレベルに設定されたオプションによって上書きされない限り、そのコレクションに対するすべてのセッションと操作に適用されます。

クライアント

timeout_msが特に指定されていない、すべてのデータベース、コレクション、セッション、トランザクション、操作に適用されます。

タイムアウト オプションの無効化とその他のオプションの設定の詳細については、次の [ オーバーライド ] セクションを参照してください。

操作レベルで 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::Clienttimeout_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 に提供された値が優先されます。

カーソルは、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

Rubyドライバーでタイムアウトの使用の詳細については、次のAPIドキュメントを参照してください。

戻る

TLS の構成

項目一覧