Amazon Kinesis データストリームがスロットリングされているのはなぜですか?
簡単な説明
メトリクスが Kinesis データストリームのクォータの範囲内であっても、次の理由でストリームがスロットリングされることがあります。
- WriteThroughputExceeded エラーおよび Rate Exceeded エラーが発生したため。
- 拡張 Kinesis ストリームモニタリングが無効になっているため。
- CloudWatch メトリクスでマイクロスパイクが表示されなくなっているため。
- CloudWatch メトリクスは成功したオペレーションについてのみ報告し、失敗したオペレーションは除外するため。
解決方法
Amazon Kinesis データストリームは、以下の理由でスロットリングされることがあります。
WriteThroughputExceeded エラーおよび Rate Exceeded エラー
ストリームでは、次の理由で WriteThroughputExceeded および Rate Exceeded というスロットリングエラーが発生することがあります。
- Kinesis データストリームに書き込まれたレコードの数がストリームのクォータを超過したため。
- レコード (パーティションキーを含む) のサイズが 1 MB を超過したため。
- 合計スループット (バイト) が Kinesis ストリームの制限を超過したため。
- プロデューサーが実行している高速リクエストが多すぎてストリームに書き込むことができないため (通常「Slow down」または「Rate exceeded」というエラーが発生)。
無効になっている拡張 Kinesis ストリームモニタリング
Kinesis データストリームの一部のシャードは、他のシャードよりも多くのレコードを受信する場合があります。これにより、ストリームでスロットリングエラーが発生し、ホットシャード (データが集中してしまったシャード) が発生することがあります。ホットシャードが発生するということは、PUT オペレーションで使用されているパーティションキーが、Kinesis ストリームのシャードに均等にレコードを分散していないということです。
disable-enhanced-monitoring 機能がオンになっていると、ホットシャードがメトリクスに表示されません。これは、ストリームレベルのメトリクスが、存在するシャードすべての集約値であることが理由です。ストリームの拡張モニタリングが無効になっていると、ストリームを個別に調べることができません。シャードごとにストリームを調べるには、enable-enhanced-monitoring コマンドを使用します。
CloudWatch メトリクスにおけるマイクロスパイクの非表示
Kinesis ストリームのクォータは、シャードごと、および 1 秒ごとに決定されます。CloudWatch で 60 秒の制限時間を超過して値が集約されると、Kinesis の時間クォータに違反するマイクロスパイクが発生することがあります。また、メトリクスは 60 秒間で集約されるため、1 分内のレコードの総数が少なく見える場合があります。しかし、その 1 分内におけるある 1 秒時点のレコード 1 つを見てみると、実際にはより大きな数を表します。トラフィックがストリームのクォータを下回っていることを示す場合がありますが、その 1 秒にスロットリングされたシャードはストリームのスロットリングとして表示されます。
成功したオペレーションについてのみ報告し、失敗したオペレーションは除外する CloudWatch メトリクス
Kinesis メトリクスは、ストリームの成功したオペレーションのみを記録します。したがって、スロットリングされたオペレーションの中には Kinesis データストリームに取り込まれないものもあります。結果として、ストリームの制限に対する違反や、メトリクスに表れないスロットリングが発生することがあります。
Kinesis データストリームに入力できない失敗のレコードが発生すると、ストリームがスロットリングされます。プロデューサーに再試行メカニズムがある場合、失敗のレコードが再試行されます。これにより、処理に遅延が発生することがあります。
Kinesis データストリームに送信されているレコードが多すぎるかどうかを確認するには、送信されたレコードの合計数を算出します。具体的には、受信レコードの合計数に、スロットリングされたレコードの数を加算します。こうすることで、スロットリングイベントにおける受信レコードの数を概算できます。
関連情報
「Kinesis Data Streams のクォータ」