セッション
MongoDB サーバーのバージョン 3.6 では、クライアントの論理セッションの概念が導入されています。 セッションは、何らかの方法で関連するアプリケーションによって実行される連続した操作のセットを表す抽象的な概念です。 セッション オブジェクトは Mongo::Client
経由で作成され、そのセッションのコンテキストで実行される必要がある操作メソッドに渡されます。
セッション オブジェクトはスレッドセーフではないことに注意してください。 これらは一度に 1 つのスレッドのみで使用する必要があります。
からセッションを作成する Mongo::Client
セッションは、クライアントでstart_session
メソッドを呼び出し、それに ブロックを渡すことで作成できます。
client.start_session do |session| # work with the session end
ブロック形式を使用する場合、ブロックの実行が完了した後にセッションはドライバーによって自動的に終了されます。
オプションを設定せずにstart_session
を呼び出すのは有効です。 これにより、サーバーに送信されるコマンドにセッション ID が含まれる場合以外では、そのセッションのコンテキストで実行される操作には影響しないセッションが生成されます。 サポートされているすべてのセッション オプションについては、 API Docsを参照してください。
ドライバーがセッションをサポートしていない配置に接続され、かつstart_session
メソッドが呼び出されると、エラーがスローされます。
サーバー セッションは一定期間使用されない場合、サーバー側で破棄されることに注意してください。 アプリケーションがクライアントで#start_session
を呼び出し、セッションの使用に 1 分以上待機すると、セッションが使用される前にセッションが古くなることがあり、エラーが発生するリスクがあることに注意してください。
セッションの使用
セッション オブジェクトはほとんどのドライバー メソッドに渡すことができ、そのセッションのコンテキストで操作を実行できます。 どのメソッドがセッション引数をサポートするかについては、 API Docsを 参照してください。
セッションを作成し、挿入を実行し、そのセッションを使用して検索を実行します。
client.start_session do |session| client[:artists].insert_one({ :name => 'FKA Twigs' }, session: session) client[:artists].find({ :name => 'FKA Twigs' }, limit: 1, session: session).first end
特定のセッションのコンテキストでMongo::Collection::View
でメソッドを呼び出したい場合は、セッションでMongo::Collection::View
を作成し、そのセッションでメソッドを呼び出します。
client.start_session(causal_consistency: true) do |session| view = client[:artists].find({ :name => 'FKA Twigs' }, session: session) view.count # will use the session end
セッション オプションを直接メソッドに渡すこともできます。 このセッションは、 Mongo::Collection::View
に関連付けられているセッションを上書きします。
client.start_session do |session| client.start_session do |second_session| view = client[:artists].find({ :name => 'FKA Twigs' }, session: session) view.count(session: second_session) # will use the second_session end end
セッションを作成する代替方法
セッションは、クライアントでstart_session
メソッドを呼び出すことで作成できます。
session = client.start_session
ブロックを渡せずにstart_session
を使用すると、ドライバーはセッションを自動的にクリーンアップせず、サーバー上にセッションが蓄積される可能性があります。 作成したセッションを手動で終了するには、 end_sessionを使用します。 サーバーはタイムアウト後に古いセッションを自動的にクリーンアップしますが、セッションが不要になったときにアプリケーションはセッションを終了する必要があります。
未確認の書込み
未確認の書込みは、セッション メカニズムの外部でのみ許可されます。未確認の書込み (write) に対して明示的なセッションが指定された場合、ドライバーは 操作ではセッション ID を送信しません。 同様に、ドライバーは未確認の書き込みには暗黙的なセッションを使用しません。
因果整合性
因果的に整合性のあるセッションにより、書込み操作の結果を読み取ることができ、セカンダリからの単調に増加する読み取りが保証されます。 因果整合性のあるセッションを作成するには、 causal_consistency
オプションを true に設定します。
session = client.start_session(causal_consistency: true) # The update message goes to the primary. collection = client[:artists] collection.update_one({ '_id' => 1 }, { '$set' => { 'x' => 0 } }, session: session) # Read your write, even when reading from a secondary! collection.find({ '_id' => 1 }, session: session).first # This query returns data at least as new as the previous query, # even if it chooses a different secondary. collection.find({ '_id' => 2 }, session: session).first
未確認の書込みはサーバーからの応答を受け取らないため(または応答を待たないため)、ドライバーは未確認の書込みが論理時間内のどこを追跡する方法がありません。 Therefore, causally consistent reads are not causally consistent with unacknowledged writes.
(causal_consistency: nil)
のように causal_consistency オプションを nil に設定すると、false として解釈されることに注意してください。
セッションを終了する
セッションを終了するには、 end_session
メソッドを呼び出します。
session.end_session
その後、Ruby ドライバーは対応するサーバー セッションの ID を再利用するためにプールに追加します。 クライアントが閉じられると、ドライバーはサーバーにコマンドを送信し、サーバー セッション プールにキャッシュされたすべてのセッションを終了します。 クライアントが閉じられたときに、ログにこのコマンドが表示されることがあります。
start_session
にブロック構文を使用している場合、ブロックの実行が完了するとセッションは自動的に終了されることに注意してください。