QLDB Kinesis에서 레코드 스트리밍 - Amazon Quantum 원장 데이터베이스(Amazon QLDB)

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

QLDB Kinesis에서 레코드 스트리밍

중요

지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 QLDB 때까지 Amazon을 사용할 수 있습니다. 자세한 내용은 Amazon QLDB Ledger를 Amazon Aurora Postgre로 마이그레이션을SQL 참조하세요.

Amazon QLDB 스트림은 지정된 Amazon Kinesis Data Streams 리소스에 제어, 블록 요약개정 세부 정보라는 세 가지 유형의 데이터 레코드를 씁니다. 세 가지 레코드 유형은 모두 Amazon Ion 형식이진수 표현으로 작성됩니다.

제어 레코드는 QLDB 스트림의 시작 및 완료를 나타냅니다. 개정이 저널에 커밋될 때마다 QLDB 스트림은 연결된 모든 저널 블록 데이터를 블록 요약 및 개정 세부 정보 레코드에 기록합니다.

세 가지 레코드 유형은 다형성입니다. 모두 QLDB 스트림ARN, 레코드 유형 및 레코드 페이로드를 포함하는 공통 최상위 레코드로 구성됩니다. 이 최상위 수준 레코드의 형식은 다음과 같습니다.

{ qldbStreamArn: string, recordType: string, payload: { //control | block summary | revision details record } }

recordType 필드는 다음 세 가지 값 중 하나를 가질 수 있습니다.

  • CONTROL

  • BLOCK_SUMMARY

  • REVISION_DETAILS

다음 섹션에서는 각 개별 페이로드 레코드의 형식과 콘텐츠를 설명합니다.

참고

QLDB 는 Amazon Ion의 바이너리 표현으로 모든 스트림 레코드를 Kinesis Data Streams에 기록합니다. 다음 예는 레코드 콘텐츠를 읽기 쉬운 형식으로 설명하기 위해 Ion의 텍스트 표현으로 제공됩니다.

제어 레코드

QLDB 스트림은 시작 및 완료 이벤트를 나타내는 제어 레코드를 작성합니다. 다음은 각 controlRecordType에 대한 샘플 데이터가 포함된 제어 레코드의 예입니다.

  • CREATED - 새로 생성된 QLDB 스트림이 활성 상태임을 나타내기 위해 스트림이 Kinesis에 기록하는 첫 번째 레코드입니다.

    { qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy", recordType:"CONTROL", payload:{ controlRecordType:"CREATED" } }
  • COMPLETED - QLDB 스트림이 지정된 종료 날짜 및 시간에 도달했음을 나타내기 위해 스트림이 Kinesis에 기록하는 마지막 레코드입니다. 스트림을 취소하면 이 레코드가 기록되지 않습니다.

    { qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy", recordType:"CONTROL", payload:{ controlRecordType:"COMPLETED" } }

블록 요약 레코드

블록 요약 레코드는 문서 수정본이 커밋되는 저널 블록을 나타냅니다. 블록은 트랜잭션 중에 QLDB 저널에 커밋되는 객체입니다.

블록 요약 레코드의 페이로드에는 블록을 커밋한 트랜잭션의 블록 주소, 타임스탬프 및 기타 메타데이터가 포함됩니다. 또한 블록 내 수정본의 요약 속성과 이를 커밋한 PartiQL 문도 포함됩니다. 다음은 샘플 데이터가 포함된 블록 요약 레코드의 예입니다.

참고

이 블록 요약 예제는 정보 제공 목적으로만 제공됩니다. 표시된 해시는 실제 계산된 해시 값이 아닙니다.

{ qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy", recordType:"BLOCK_SUMMARY", payload:{ blockAddress:{ strandId:"ElYL30RGoqrFCbbaQn3K6m", sequenceNo:60807 }, transactionId:"9RWohCo7My4GGkxRETAJ6M", blockTimestamp:2019-09-18T17:00:14.601000001Z, blockHash:{{6Pk9KDYJd38ci09oaHxx0D2grtgh4QBBqbDS6i9quX8=}}, entriesHash:{{r5YoH6+NXDXxgoRzPREGAWJfn73KlZE0eTfbTxZWUDU=}}, previousBlockHash:{{K3ti0Agk7DEponywKcQCPRYVHb5RuyxdmQFTfrloptA=}}, entriesHashList:[ {{pbzvz6ofJC7mD2jvgfyrY/VtR01zIZHoWy8T1VcxlGo=}}, {{k2brC23DLMercmiOWHiURaGwHu0mQtLzdNPuviE2rcs=}}, {{hvw1EV8k4oOkIO36kblO/+UUSFUQqCanKuDGr0aP9nQ=}}, {{ZrLbkyzDcpJ9KWsZMZqRuKUkG/czLIJ4US+K5E31b+Q=}} ], transactionInfo:{ statements:[ { statement:"SELECT * FROM Person WHERE GovId = ?", startTime:2019-09-18T17:00:14.587Z, statementDigest:{{p4Dn0DiuYD3Xm9UQQ75YLwmoMbSfJmopOmTfMnXs26M=}} }, { statement:"INSERT INTO Person ?", startTime:2019-09-18T17:00:14.594Z, statementDigest:{{klMLkLfa5VJqk6JUPtHkQpOsDdG4HmuUaq/VaApQflU=}} }, { statement:"INSERT INTO VehicleRegistration ?", startTime:2019-09-18T17:00:14.598Z, statementDigest:{{B0gO9BWVNrzRYFoe7t+GVLpJ6uZcLKf5t/chkfRhspI=}} } ], documents:{ '7z2OpEBgVCvCtwvx4a2JGn':{ tableName:"Person", tableId:"LSkFkQvkIOjCmpTZpkfpn9", statements:[1] }, 'K0FpsSLpydLDr7hi6KUzqk':{ tableName:"VehicleRegistration", tableId:"Ad3A07z0ZffC7Gpso7BXyO", statements:[2] } } }, revisionSummaries:[ { hash:{{uDthuiqSy4FwjZssyCiyFd90XoPSlIwomHBdF/OrmkE=}}, documentId:"7z2OpEBgVCvCtwvx4a2JGn" }, { hash:{{qJID/amu0gN3dpG5Tg0FfIFTh/U5yFkfT+g/O6k5sPM=}}, documentId:"K0FpsSLpydLDr7hi6KUzqk" } ] } }

revisionSummaries 필드의 일부 수정본에는 documentId가 없을 수 있습니다. 이는 사용자 데이터를 포함하지 않는 내부 전용 시스템 수정본입니다. 이러한 개정의 해시는 저널의 전체 해시 체인의 일부이므로 QLDB 스트림에는 해당 블록 요약 레코드에 이러한 개정이 포함됩니다. 암호화 확인에는 전체 해시 체인이 필요합니다.

다음 섹션에 설명된 대로 문서 ID가 있는 수정본만 별도의 수정본 세부 정보 레코드에 게시됩니다.

수정본 세부 정보 레코드

수정 세부 정보 레코드는 저널에 커밋된 문서 수정본을 나타냅니다. 페이로드에는 수정본의 커밋된 보기의 모든 속성이 관련 테이블 이름 및 테이블 ID와 함께 포함되어 있습니다. 다음은 샘플 데이터가 포함된 수정 레코드의 예입니다.

{ qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy", recordType:"REVISION_DETAILS", payload:{ tableInfo:{ tableName:"VehicleRegistration", tableId:"Ad3A07z0ZffC7Gpso7BXyO" }, revision:{ blockAddress:{ strandId:"ElYL30RGoqrFCbbaQn3K6m", sequenceNo:60807 }, hash:{{qJID/amu0gN3dpG5Tg0FfIFTh/U5yFkfT+g/O6k5sPM=}}, data:{ VIN:"1N4AL11D75C109151", LicensePlateNumber:"LEWISR261LL", State:"WA", City:"Seattle", PendingPenaltyTicketAmount:90.25, ValidFromDate:2017-08-21, ValidToDate:2020-05-11, Owners:{ PrimaryOwner:{PersonId:"7z2OpEBgVCvCtwvx4a2JGn"}, SecondaryOwners:[] } }, metadata:{ id:"K0FpsSLpydLDr7hi6KUzqk", version:0, txTime:2019-09-18T17:00:14.602Z, txId:"9RWohCo7My4GGkxRETAJ6M" } } } }

중복 및 out-of-order 레코드 처리

QLDB 스트림은 중복 및 out-of-order 레코드를 Kinesis Data Streams에 게시할 수 있습니다. 따라서 소비자 애플리케이션은 이러한 시나리오를 식별하고 처리하기 위해 자체 로직을 구현해야 할 수 있습니다. 블록 요약 및 수정 세부 정보 레코드에는 이러한 목적으로 사용할 수 있는 필드가 포함되어 있습니다. 이러한 필드를 다운스트림 서비스의 기능과 함께 사용하면 고유한 ID와 레코드의 엄격한 순서를 모두 나타낼 수 있습니다.

예를 들어 OpenSearch , 인덱스QLDB와 통합되어 문서에 대한 전체 텍스트 검색 기능을 제공하는 스트림을 고려해 보세요. 이 사용 사례에서는 문서의 오래된(out-of-order) 개정이 인덱싱되지 않도록 해야 합니다. 순서 지정 및 중복 제거를 적용하려면 개정 세부 정보 레코드의 문서 ID 및 버전 필드와 OpenSearch함께 의 문서 ID 및 외부 버전 필드를 사용할 수 있습니다.

Amazon OpenSearch ServiceQLDB와 통합되는 샘플 애플리케이션의 중복 제거 로직 예제는 GitHub 리포지토리 aws-samples/amazon-qldb-streaming-amazon-opensearch-service-sample-python를 참조하세요.