Amazon QLDB에서 드라이버를 사용한 세션 관리에 대한 이해 - Amazon Quantum Ledger Database(QLDB)

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon QLDB에서 드라이버를 사용한 세션 관리에 대한 이해

관계형 데이터베이스 관리 시스템(RDBMS)을 사용해 본 경험이 있다면 동시 연결에 익숙할 것입니다. 트랜잭션이 HTTP 요청 및 응답 메시지로 실행되기 때문에 QLDB는 기존 RDBMS 연결과 같은 개념을 가지고 있지 않습니다.

QLDB에서 유사한 개념은 활성 세션입니다. 세션은 개념적으로 사용자 로그인과 비슷합니다. 즉, 원장에 대한 데이터 트랜잭션 요청에 대한 정보를 관리합니다. 활성 세션은 트랜잭션을 활발하게 실행하는 세션입니다. 또한 서비스가 즉시 다른 트랜잭션을 시작할 것으로 예상하는, 트랜잭션을 최근에 완료한 세션일 수도 있습니다. QLDB는 세션당 하나의 활성 실행 트랜잭션을 지원합니다.

원장당 동시 활성 세션의 한도는 Amazon QLDB 할당량 및 제한에 정의되어 있습니다. 이 한도에 도달한 후 트랜잭션을 시작하려는 모든 세션에서 오류(LimitExceededException)가 발생합니다.

QLDB 드라이버를 사용하여 애플리케이션에서 세션 풀을 구성하는 모범 사례는 Amazon QLDB 드라이버 권장 사항QLDBDriver 객체 구성 섹션을 참조하세요.

세션 라이프사이클

다음 QLDB 세션 API 작업 시퀀스는 QLDB 세션의 일반적인 라이프사이클를 나타냅니다.

  1. StartSession

  2. StartTransaction

  3. ExecuteStatement

  4. CommitTransaction

  5. 더 많은 트랜잭션을 시작하려면 2-4단계를 반복합니다(한 번에 한 트랜잭션씩).

  6. EndSession

세션 만료

QLDB는 트랜잭션이 활발하게 실행되고 있는지 여부와 상관없이 총 13~17분이 지나면 세션이 만료되고 삭제됩니다. 세션은 하드웨어 장애, 네트워크 장애 또는 애플리케이션 재시작과 같은 여러 가지 이유로 손실되거나 손상될 수 있습니다. QLDB는 클라이언트 애플리케이션이 세션 장애에 대해 복원력을 유지할 수 있도록 세션에 최대 수명을 적용합니다.

QLDB 드라이버에서의 세션 처리

AWS SDK를 사용하여 QLDB 세션 API와 직접 상호 작용할 수 있지만, 이 경우 복잡성이 가중되고 체결 다이제스트를 계산해야 합니다. QLDB는 이 체결 다이제스트를 사용하여 트랜잭션 무결성을 보장합니다. 이 API와 직접 상호 작용하는 대신 QLDB 드라이버를 사용하는 것이 좋습니다.

드라이버는 트랜잭션 데이터 API 위에 높은 수준의 추상 계층을 제공합니다. SendCommand API 호출을 관리하여 원장 데이터에서 PartiQL 문을 실행하는 프로세스를 간소화합니다. 이러한 API 호출에는 세션, 트랜잭션 관리, 오류 발생 시 재시도 정책 등 드라이버가 대신 처리하는 여러 파라미터가 필요합니다.

세션 풀링 개요

이전 버전의 QLDB 드라이버(예: Java v1.1.0)에서는 드라이버 객체의 두 가지 구현, 즉 표준, 비풀링 QldbDriverPooledQldbDriver를 제공했습니다. 명칭에서 알 수 있듯이 PooledQldbDriver는 여러 트랜잭션에서 재사용되는 세션 풀을 유지 관리합니다.

사용자 피드백에 따르면 개발자들은 표준 드라이버를 사용하는 대신 풀링 기능과 그 이점을 기본으로 사용하는 것을 선호합니다. 따러서 PooledQldbDriver를 제거하고 세션 풀링 기능을 QldbDriver로 옮겼습니다. 이 변경 사항은 각 드라이버의 최근 릴리스(예: Java v2.0.0)에 포함되어 있습니다.

드라이버는 세 가지 수준의 추상화를 제공합니다.

  • 드라이버(풀링된 드라이버 구현) - 최상위 추상화입니다. 드라이버는 세션 풀을 유지 및 관리합니다. 드라이버에게 트랜잭션을 실행하도록 요청하면 드라이버는 풀에서 세션을 선택하고 이를 사용하여 트랜잭션을 실행합니다. 세션 오류(InvalidSessionException)로 인해 트랜잭션이 실패하는 경우 드라이버는 다른 세션을 사용하여 트랜잭션을 재시도합니다. 기본적으로 드라이버는 종합 관리형 세션 환경을 제공합니다.

  • 세션 - 드라이버 추상화보다 한 수준 낮습니다. 세션은 풀에 포함되며 드라이버는 세션의 라이프사이클를 관리합니다. 트랜잭션이 실패하면 드라이버는 동일한 세션을 사용하여 지정된 횟수까지 트랜잭션을 재시도합니다. 그러나 세션에서 오류(InvalidSessionException)가 발생하면 QLDB는 해당 오류를 내부적으로 삭제합니다. 그러면 드라이버는 풀에서 다른 세션을 가져와 트랜잭션을 재시도해야 합니다.

  • 트랜잭션 - 가장 낮은 추상화 수준입니다. 트랜잭션은 세션에 포함되며 세션은 트랜잭션의 라이프사이클를 관리합니다. 세션은 오류 발생 시 트랜잭션을 재시도합니다. 또한 세션은 체결되거나 취소되지 않은 열린 트랜잭션이 유출되지 않도록 합니다.

각 드라이버의 최신 버전에서는 드라이버 추상화 수준에서만 작업을 수행할 수 있습니다. 개별 세션과 트랜잭션을 직접 제어할 수 없습니다. (즉, 새 세션이나 트랜잭션을 수동으로 시작하는 API 작업이 없습니다.)

세션 풀링 및 트랜잭션 로직

각 드라이버의 최근 릴리스에서는 더 이상 드라이버 객체의 비풀링 구현을 제공하지 않습니다. 기본적으로 QldbDriver 객체는 세션 풀을 관리합니다. 트랜잭션을 실행하기 위해 호출을 하면 드라이버가 다음 단계를 수행합니다.

  1. 드라이버는 세션 풀 한도에 도달했는지 확인합니다. 그럴 경우 드라이버는 즉시 NoSessionAvailable 예외를 발생시킵니다. 아니면 그 다음 단계로 이동합니다.

  2. 드라이버는 풀에 사용 가능한 세션이 있는지 확인합니다.

    • 풀에서 세션을 사용할 수 있는 경우 드라이버는 해당 세션을 사용하여 트랜잭션을 실행합니다.

    • 풀에 사용 가능한 세션이 없는 경우 드라이버는 새 세션을 만들고 이를 사용하여 트랜잭션을 실행합니다.

  3. 드라이버가 2단계에서 세션을 가져오면 드라이버가 세션 인스턴스에서 execute 작업을 호출합니다.

  4. 세션의 execute 작업에서 드라이버는 startTransaction를 호출하여 트랜잭션을 시작하려고 합니다.

    • 세션이 유효하지 않으면 startTransaction 호출이 실패하고 드라이버는 1단계로 돌아갑니다.

    • startTransaction 호출이 성공하면 드라이버는 다음 단계로 진행됩니다.

  5. 드라이버가 Lambda 표현식을 실행합니다. 이 Lambda 표현식에는 PartiQL 문을 실행하기 위한 하나 이상의 호출이 포함될 수 있습니다. Lambda 표현식이 오류 없이 실행을 마치면 드라이버는 트랜잭션 체결을 진행합니다.

  6. 트랜잭션을 체결하면 다음 두 가지 결과 중 하나가 발생할 수 있습니다.

    • 체결이 성공하고 드라이버가 제어권을 애플리케이션 코드에 반환합니다.

    • OCC(낙관적 동시성 제어) 충돌로 인해 체결이 실패합니다. 이 경우 드라이버는 동일한 세션을 사용하여 4~6단계를 재시도합니다. 최대 재시도 횟수는 애플리케이션 코드에서 구성할 수 있습니다. 기본 한도는 4입니다.

참고

4~6단계에서 InvalidSessionException가 발생하면 드라이버는 세션을 닫힌 것으로 표시하고 1단계로 돌아가 트랜잭션을 재시도합니다.

4~6단계에서 다른 예외가 발생하는 경우 드라이버는 예외를 재시도할 수 있는지 확인합니다. 그럴 경우 지정된 재시도 횟수까지 트랜잭션을 재시도합니다. 그렇지 않으면 예외가 애플리케이션 코드에 전파(버블 업되어 발생)됩니다.

풀로 세션 반환하기

활성 트랜잭션이 진행되는 동안 언제든지 InvalidSessionException가 발생하는 경우 드라이버는 세션을 풀로 반환하지 않습니다. QLDB는 대신 세션을 삭제하고 드라이버는 풀에서 다른 세션을 가져옵니다. 다른 모든 경우에는 드라이버가 세션을 풀에 반환합니다.