💪
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(シャードイテレータ)。
- 「シャードのどこから読むか」を示すカーソル。
- API
GetShardIterator
を使って取得する。 - 得られた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