Kinesis Streams オンデマンドモードのスケール動作

Kinesis Data Streams

Kinesis Streams のドキュメントを読んでいて、オンデマンドモード利用時のスループットのスケール動作が気になったので調べたことをメモしておこうと思います。

ドキュメント

今回気になったのは以下の部分です。

A data stream in the on-demand mode accommodates up to double the peak write throughput observed in the previous 30 days. As your data stream’s write throughput reaches a new peak, Kinesis Data Streams scales the data stream’s capacity automatically. For example, if your data stream has a write throughput that varies between 10 MB/s and 40 MB/s, then Kinesis Data Streams ensures that you can easily burst to double your previous peak throughput, or 80 MB/s. If the same data stream sustains a new peak throughput of 50 MB/s, Kinesis Data Streams ensures that there is enough capacity to ingest 100 MB/s of write throughput. However, write throttling can occur if your traffic increases to more than double the previous peak within a 15-minute duration. You need to retry these throttled requests.

https://docs.aws.amazon.com/streams/latest/dev/how-do-i-size-a-stream.html#ondemandmode

要約すると

  • オンデマンドモードでは、過去 30 日間における最大書き込みスループットの 2 倍まで対応できるスループットを持つ
  • 最大書き込みスループットが更新されると、新しい最大値の 2 倍まで対応できるようにスケールする
  • ただし、15 分以内の間隔で最大書き込みスループットが 2 倍以上になると、スロットリングする可能性がある
  • スロットリングした場合は、書き込みリクエストをユーザー側でリトライする必要がある

ということのようです。

初めてこの記載を読んだとき、最大 2 倍まで対応というのが具体的にどういうことなのか理解できませんでした。

実は、同じドキュメントの少し後の記載をみるとこの動作を理解できます。

With the on-demand capacity mode (same as with the provisioned capacity mode), you must specify a partition key with each record to write data into your data stream. Kinesis Data Streams uses your partition keys to distribute data across shards. Kinesis Data Streams monitors traffic for each shard. When the incoming traffic exceeds 500 KB/s per shard, it splits the shard within 15 minutes. The parent shard’s hash key values are redistributed evenly across child shards.

この記載によると、Kinesis Streams は各シャードのトラフィックを監視しており、受信トラフィック (書き込み) がシャードあたり 500 KB/s を超えると、15 分以内にシャードを分割するそうです。Kinesis Streams では、シャードごとにスループットの上限が決まっており、ストリーム全体のスループット上限はシャードの数に依存します。シャードごとのスループット上限は一律で、書き込み 1 MB/s、読み取り 2 MB/s と決まっています。

つまり、過去 30 日間における最大書き込みスループットを基準として、シャードごとに 50% (500 KB/s) までのスループットで、その基準に対応できるようにシャード数をスケールさせるようです。シャード分割に最大で 15 分かかるため、15 分以内で書き込みスループットがスパイクしすぎるとシャードのスループット上限を超えてスロットリングする可能性があると理解できます。

デフォルトのオンデマンドモードの場合は、ストリームに含まれるシャードは 4 つですので、はじめのうちは書き込みでスロットリングしやすい状況になりうるかと思います。その場合には、あらかじめプロビジョニングモードで必要なシャード数を確保したうえで、オンデマンドモードへ変更して運用するなどが良いかと思います。