세션
MongoDB Server 버전 3.6에서는 클라이언트를 위한 논리적 세션 개념이 도입되었습니다. 세션은 어떤 방식으로든 관련된 애플리케이션에서 실행되는 일련의 순차적 작업을 나타내는 추상적인 개념입니다. 세션 객체는 Mongo::Client
를 통해 생성되어 해당 세션의 컨텍스트에서 실행되어야 하는 작업 메서드에 전달될 수 있습니다.
세션 객체는 스레드로부터 안전하지 않습니다. 한 번에 하나의 스레드에서만 사용해야 합니다.
다음에서 세션 만들기 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 을 사용합니다. 서버 는 시간 초과 후 이전 세션을 자동으로 정리하지만 세션이 더 이상 필요하지 않으면 애플리케이션 이 세션을 종료해야 합니다.
승인되지 않은 쓰기
승인되지 않은 쓰기는 세션 메커니즘 외부에서만 허용됩니다. 승인되지 않은 쓰기에 대해 명시적 세션이 제공되는 경우 드라이버는 작업과 함께 세션 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
승인되지 않은 쓰기는 서버로부터 응답을 받지 않기 때문에(또는 응답을 기다리지 않기 때문에) 드라이버는 논리적 시간에서 승인되지 않은 쓰기가 어디에 있는지 추적할 방법이 없습니다. 따라서 인과적으로 일관된 읽기는 승인되지 않은 쓰기와 인과적으로 일관되지 않습니다.
(causal_consistency: nil)
에서와 같이 causal_consistency 옵션을 nil로 설정하면 false로 해석됩니다.
세션 종료
세션을 종료하려면 end_session
메서드를 호출합니다.
session.end_session
그런 다음 Ruby 드라이버는 재사용을 위해 해당 서버 세션의 ID를 풀에 추가합니다. 클라이언트가 닫히면 드라이버는 서버에 명령을 보내 서버 세션 풀에 캐시된 모든 세션을 종료합니다. 클라이언트가 닫힐 때 로그에서 이 명령을 볼 수 있습니다.
start_session
에 대한 차단 구문 을 사용하는 경우 차단 실행이 완료된 후 세션이 자동으로 종료됩니다.