💪

Kinesis Data Streamsのシーケンス番号とGetShardIteratorの理解

に公開

はじめに

AWS Kinesis Data Streamsは、大量のデータをリアルタイムで取り込み・処理するためのサービス。しかし、「ストリームに書かれたデータをどこから読み始めるか?」を制御しないと、効率的に処理できない。
本記事では、シーケンス番号(Sequence Number)とGetShardIteratorを中心に、データの読み取り方法を解説する。

基本用語解説

レコード:プロデューサーがストリームに送る最小単位のデータ
シャード:基本的な処理・保存の単位
プロデューサー:データをKinesisストリームに送信する側
コンシューマー:Kinesisに送られたデータを読み取って処理する側

シーケンス番号(Sequence Number)の基礎

KinesisにレコードをPutRecord/PutRecordsで書き込むと、各シャードのレコードにユニークなシーケンス番号が付与される。

  • シャードごとに番号が管理される
  • データはシャード内で順序保証される
  • 読み取りの基準点として使える
    この番号を利用して、「どこからデータを再処理するか」や「最新だけを読むか」といった制御が可能になる。

data-start-sequenceの役割

データをどこから読むかを決めるのがdata-start-sequenceの考え方。
Kinesisでは以下の指定が可能

  • LATEST:新しく到着するレコードから
  • TRIM_HORIZON:利用可能な一番古いデータから
  • AT_SEQUENCE_NUMBER:特定のシーケンス番号のレコードから
  • AT_TIMESTAMP:指定した時刻以降のレコードから

利用シーンの例

  • リアルタイム処理LATEST
  • ログ収集やバッチ処理TRIM_HORIZON
  • リプレイや障害復旧AT_SEQUENCE_NUMBER / AFTER_SEQUENCE_NUMBER

Shard Iteratorとは?

シーケンス番号だけでは直接データを読めない。
そのために必要なのがShard Iterator(シャードイテレータ)

  • 「シャードのどこから読むか」を示すカーソル。
  • APIGetShardIteratorを使って取得する。
  • 得られたShardIteratorをGetRecordsで渡すとデータが帰ってくる。

AWS CLIでの操作例

Shard Iteratorを取得する

aws kinesis get-shard-iterator \
  --stream-name my-stream \
  --shard-id shardId-000000000000 \
  --shard-iterator-type TRIM_HORIZON

レスポンス例:

{
  "ShardIterator": "AAAAAAAAAA...example..."
}

get-recordsの流れ

ShardIteratorを使って実際にレコードを取得する。

aws kinesis get-records \
  --shard-iterator "AAAAAAAAAA...example..." \
  --limit 10

指定した位置から最大10件のレコードが返る。
次の読み取りに必要な新しいNextShardIteratorも返ってくるため、ループ処理すれば連続してデータを取得できる。

注意点

  • データ保持期間はデフォルト24時間、最大7日
    →期限を過ぎたデータはTRIM_HORIZONでも読めない
  • シャード分割(reshard)すると新しいシャードが作られ、シーケンス番号はリセットされる
  • 1回のget-recordsで取得できる上限は10MBまたは10,000件

まとめ

  • Sequence Numberは各レコードに付与されるユニークな順序番号
  • data-start-sequenceで「どこから読むか」を制御できる
  • GetShardIteratorで読み取りカーソルを取得し、GetRecordsで実際のデータを読む

Discussion