

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Kinesis 中的 QLDB 串流記錄
<a name="streams.records"></a>

**重要**  
終止支援通知：現有客戶將可以使用 Amazon QLDB，直到 07/31/2025 終止支援為止。如需詳細資訊，請參閱[將 Amazon QLDB Ledger 遷移至 Amazon Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

Amazon QLDB 串流會將三種類型的資料記錄寫入指定的 Amazon Kinesis Data Streams 資源：*控制項*、*區塊摘要*和*修訂詳細資訊*。這三種記錄類型都是以 [Amazon Ion 格式](ion.md)的*二進位表示形式*撰寫。

控制記錄指出 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 的文字表示法中，以可讀格式說明記錄內容。

**Topics**
+ [控制記錄](#streams.records.control)
+ [封鎖摘要記錄](#streams.records.block)
+ [修訂詳細資訊記錄](#streams.records.revision)
+ [處理重複和out-of-order的記錄](#streams.records.ordering)

## 控制記錄
<a name="streams.records.control"></a>

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"
    }
  }
  ```

## 封鎖摘要記錄
<a name="streams.records.block"></a>

*區塊摘要*記錄代表遞交文件修訂的日誌區塊。[區塊](journal-contents.md)是在交易期間遞交至 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 的修訂才會發佈在單獨的修訂詳細資訊記錄中，如下節所述。

## 修訂詳細資訊記錄
<a name="streams.records.revision"></a>

*修訂詳細資訊*記錄代表遞交至日誌的文件修訂。承載包含來自修訂[遞交檢視](working.metadata.md)的所有屬性，以及相關聯的資料表名稱和資料表 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的記錄
<a name="streams.records.ordering"></a>

QLDB 串流可以將重複和out-of-order的記錄發佈至 Kinesis Data Streams。因此，消費者應用程式可能需要實作自己的邏輯，以識別和處理此類案例。區塊摘要和修訂詳細資訊記錄包含您可以用於此目的的欄位。結合下游服務的功能，這些欄位可以指出記錄的唯一身分和嚴格順序。

例如，請考慮將 QLDB 與 OpenSearch 索引整合的串流，以提供文件的全文搜尋功能。在此使用案例中，您需要避免對文件的過時 (out-of-order) 修訂編製索引。若要強制執行排序和重複資料刪除，您可以使用 OpenSearch 中的文件 ID 和外部版本欄位，以及修訂詳細資訊記錄中的文件 ID 和版本欄位。

如需整合 QLDB 與 Amazon OpenSearch Service 的範例應用程式中重複資料刪除邏輯的範例，請參閱 GitHub 儲存庫 [aws-samples/amazon-qldb-streaming-amazon-opensearch-service-sample-python](https://github.com/aws-samples/amazon-qldb-streaming-amazon-opensearch-service-sample-python)。