Kinesis データストリームでの ReadProvisionedThroughputExceeded 例外を検出してトラブルシューティングするにはどうすればよいですか?

所要時間2分
0

Amazon Kinesis Data Streamsで ReadProvisionedThroughputExceeded エラーが発生しましたが、なぜこのようなことが起こっているのかわかりません。

簡単な説明

ReadProvisionedThroughputExceeded エラーは、Kinesis データストリームが一定期間にわたって GetRecords 呼び出しを制限した場合に発生します。

次のクォータを超えると、Amazon Kinesis データストリームが制限される可能性があります:

  • 各シャードは、1 秒あたり最大 5 件の読み取りトランザクション、または各シャードで 1 秒あたり 5 回の GetRecords 呼び出しをサポートします。
  • 各シャードは、1 秒あたり 2 MiB の最大読み取り速度をサポートします。
  • GetRecords は、1 つのシャードから呼び出しごとに最大 10 MiB のデータを取得し、1 回の呼び出しで最大 10,000 レコードを取得します。GetRecords の呼び出しが 10 MiB のデータを返す場合、次の 5 秒以内に行われる以降の呼び出しはエラーになります。

ReadProvisionedThroughputExceeded エラーが発生した場合は、次のタスクのいずれかを実行してください:

  • 問題の根本原因を特定してください。
  • 発生する可能性のあるマイクロバーストを特定してください。
  • Kinesis データストリームのベストプラクティスに従ってください。

解決策

問題の根本原因を特定

データストリームの ReadProvisionedThroughputExceeded エラーの根本原因を特定するには、Amazon CloudWatch で Amazon Kinesis データストリームサービスをモニタリングしてください

CloudWatch の以下のメトリクスを確認してください:

  • GetRecords.Bytes: 指定された期間に測定された、データストリームから取得されたバイト数。
  • GetRecords.Records: 指定された期間にデータストリームから取得されたレコードの数。
  • ReadProvisionedThroughputExceeded: データストリームでスロットリングしている GetRecords 呼び出しの数。

CloudWatch ダッシュボードを設定して、期間を 1 分に設定して統計情報を合計として表示します。次に、合計を 60 秒で割って平均値を求めます。

たとえば、GetRecords.Records メトリック値を使用する場合、合計 を 60 秒で除算して、1 秒あたりに送信されるレコードの平均数を計算します。次に、平均値が、データストリームに設定されている制限の 1 秒あたりに送信されるレコード数よりも少ないかどうかを確認します。シャードクォータの詳細については、「クォータと制限」を参照してください。

注: 拡張モニタリング機能を有効にして、負荷がすべてのシャードに均等に分散されるようにします。

GetRecords.Records メトリクスを使用して、統計情報を SampleCount として表示し、期間を 1 分に設定することもできます。SampleCount 値を 60 秒で割ると、各シャードの 1 秒あたりに行われる GetRecords 呼び出しの平均回数が計算されます。平均値が 1 秒あたり約 5 回の GetRecords 呼び出しで、ReadProvisionedThroughputExceeded エラーが発生した場合は、コンシューマーとシャードクォータを確認してください。コンシューマーがシャードの制限を超えていない場合、ReadProvisionedThroughputExceeded エラーは、コンシューマーが 1 秒あたり 5 回以上の GetRecords 呼び出しを行っていることが原因である可能性があります。

最後に、シャードの ReadProvisionedThroughputExceeded の値に違いがあるかどうかを確認します。シャードの分布が不均一な場合や、一方のシャードが受け取るデータが他方のシャードよりも多い場合や少ない場合は、分散の不均衡が発生する可能性があります。このシャード分散の不均衡を解決し、ホットシャードを回避するには、putRecords API 呼び出しで UUID をパーティションキーとして使用します。

発生する可能性のあるマイクロバーストの特定

まれではありますが、メトリックス値がシャードクォータを下回ると、読み取り中にデータストリームがスロットリングすることがあります。

たとえば、GetRecords.Bytes Sum:1min は、1 分間に 10 MiB のデータが読み取られたことを表します。1 秒後、GetRecords.Bytes 呼び出しはスロットリングなしで 2 MiB のデータを読み取ります。その後、2 秒後に GetRecords.Bytes 呼び出しは 8 MiB のデータを読み取ります。3 秒経過すると、読み取り操作やスロットリングが行われない可能性があります。1 分間のシャードクォータに達していなくても (2 MiB\ * 60 = 120 MiB のデータ)、ReadProvisionedThroughputExceeded エラーが表示されることがあります。メトリクス値が突然急上昇していることに気付いた場合は、ReadProvisionedThroughputExceeded 例外を引き起こしているマイクロバーストを探してください。

Kinesis データストリームのベストプラクティスに従います

ReadProvisionedThroughputExceeded の例外を軽減するには、以下のベストプラクティスに従ってください:

  • ストリームをリシャーディングして、ストリーム内のシャードの数を増やします。
  • GetRecords リクエストのサイズを小さくしてください。制限パラメータを設定するか、GetRecords リクエストの頻度を減らしてください。
    注: コンシューマーが Amazon Kinesis Data Firehose の場合、データストリームは行われる GetRecords 呼び出しの頻度に合わせて調整されます。コンシューマーがイベントソースマッピングのある AWS Lambda 関数である場合、ストリームは 1 秒に 1 回ポーリングされます。ポーリング頻度は変更できません。コンシューマーが Amazon Kinesis クライアントライブラリ (KCL) アプリケーションの場合は、ポーリング頻度を調整します。ポーリング頻度を調整するには、KinesisClientLibConfiguration ファイルの DEFAULT_IDLETIME_BETWEEN_READS_MILLIS パラメーター値を変更します。この値はコード内で動的に設定できます。KCL でこの値を変更する方法の詳細については、GitHub ウェブサイトの「amazon-kinesis-client」を参照してください。
  • 読み取り操作と書き込み操作をデータストリームのすべてのシャードにできるだけ均等に分散します。
  • データストリームで5人以上のコンシューマーが使用されている場合は、enhanced fan-out コンシューマーを使用してください。
  • **ReadProvisionedThroughputExceeded ** 例外が発生した場合は、コンシューマーロジックでエラーリトライとエクスポネンシャルバックオフメカニズムを使用してください。AWS SDK を使用するコンシューマーアプリケーションの場合、リクエストはデフォルトで再試行されます。
AWS公式
AWS公式更新しました 5ヶ月前