QLDBKinesis에서 레코드 스트리밍 - 아마존 퀀텀 레저 데이터베이스 (아마존QLDB)

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

QLDBKinesis에서 레코드 스트리밍

중요

지원 종료 알림: 기존 고객은 2025년 7월 31일 지원이 종료될 QLDB 때까지 Amazon을 사용할 수 있습니다. 자세한 내용은 아마존 QLDB 원장을 Amazon Aurora SQL Postgre로 마이그레이션을 참조하십시오.

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

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

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