如何偵測 Kinesis Data Streams 中的 ReadProvisionedThroughputExceeded 例外狀況並對其進行疑難排解?

2 分的閱讀內容
0

我在 Amazon Kinesis Data Streams 中遇到 ReadProvisionedThroughputExceeded 錯誤,但我不知道為什麼會發生這種情況。

簡短描述

當 Kinesis Data Streams 在一段時間內對 GetRecords 呼叫限流時,會發生 ReadProvisionedThroughputExceeded 錯誤。

如果超過下列配額,您的 Amazon Kinesis 資料串流可能受到限流:

  • 每個碎片每秒最多支援五個讀取交易,或每個碎片每秒最多支援五次 GetRecords 呼叫。
  • 每個碎片支援每秒 2 MiB 的最大讀取速率。
  • GetRecords 每次呼叫從單一碎片擷取最多 10 MiB 資料,每次呼叫最多擷取 1 萬筆記錄。如果對 GetRecords 的呼叫傳回 10 MiB 資料,則在接下來 5 秒內進行的後續呼叫會導致錯誤。

如果遇到 ReadProvisionedThroughputExceeded 錯誤,請完成下列其中一項任務:

  • 識別問題的根本原因。
  • 識別可能的微爆量。
  • 遵循 Kinesis Data Streams 最佳實務。

解決方法

識別問題的根本原因

若要識別資料串流中 ReadProvisionedThroughputExceeded 錯誤的根本原因,請使用 Amazon CloudWatch 監控 Amazon Kinesis Data Streams 服務

在 CloudWatch 中檢閱下列指標:

  • **GetRecords.Bytes:**在指定時段內測量的、從資料串流擷取的位元組數。
  • **GetRecords.Records:**在指定時段內從資料串流擷取的記錄數。
  • **ReadProvisionedThroughputExceeded:**資料串流中限流的 GetRecords 呼叫數。

設定 CloudWatch 儀表板,以將統計資料顯示為總和,並將時段設定為 1 分鐘。然後,將總和除以 60 秒以取得平均值。

例如,如果使用 GetRecords.Records 指標值,將總和除以 60 秒可計算每秒傳送的平均記錄數。然後,檢查平均值是否小於為資料串流設定的限制每秒傳送的記錄數。如需有關碎片配額的詳細資訊,請參閱配額和限制

**注意:**開啟增強型監控功能,以確保負載均勻分佈在所有碎片中。

您也可以使用 GetRecords.Records 指標,將統計資料視為 SampleCount,並將時段設定為 1 分鐘。將 SampleCount 值除以 60 秒,可計算每個碎片每秒進行的 GetRecords 呼叫的平均次數。如果平均值約為每秒五次 GetRecords 呼叫,且您收到 ReadProvisionedThroughputExceeded 錯誤,請檢閱您的取用者和碎片配額。如果取用者沒有超出碎片限制,則 ReadProvisionedThroughputExceeded 錯誤可能是因為您的取用者每秒進行超過五次 GetRecords 呼叫。

最後,檢查碎片的 ReadProvisionedThroughputExceeded 值之間是否有差異。如果碎片的分佈不均勻,或者一個碎片接收的資料多於或少於另一個碎片,則可能會發生分佈不平衡。若要解決此碎片分佈不平衡並避免熱碎片,請在 putRecords API 呼叫中使用 UUID 作為分割區索引鍵。

識別可能的微爆量

儘管很少見,但指標值可能低於碎片配額,並導致資料串流在讀取期間限流。

例如,GetRecords.Bytes Sum:1min 表示 1 分鐘讀取 10 MiB 資料。在 1 秒時,GetRecords.Bytes 呼叫讀取 2 MiB 的資料,沒有任何限流。然後在 2 秒時,GetRecords.Bytes 呼叫讀取 8 MiB 資料。在 3 秒時,可能沒有任何讀取操作或任何限流。儘管未達到此分鐘的碎片配額 (2MiB * 60 = 120MiB 資料),您可能會收到 ReadProvisionedThroughputExceeded 錯誤。如果您發現指標值突然激增,請尋找導致 ReadProvisionedThroughputExceeded 例外狀況的微爆量。

遵循 Kinesis Data Streams 最佳實務

若要減少 ReadProvisionedThroughputExceeded 例外狀況,請遵循下列最佳實務:

  • 對串流進行重新碎片以增加串流中的碎片數量。
  • 縮小 GetRecords 請求的大小。設定限制參數,或減少 GetRecords 請求的頻率。
    **注意:**如果取用者是 Amazon Kinesis Data Firehose,資料串流會根據進行的 GetRecords 呼叫的頻率調整。如果取用者是具有事件來源映射的 AWS Lambda 函數,則每秒輪詢串流一次。您無法修改輪詢頻率。如果取用者是 Amazon Kinesis Client Library (KCL) 應用程式,請調整輪詢頻率。若要調整輪詢頻率,請修改 KinesisClientLibConfiguration 檔案中的 DEFAULT_IDLETIME_BETWEEN_READS_MILLIS 參數值。您可以在程式碼中動態設定此值。如需有關如何在 KCL 中修改此值的詳細資訊,請參閱 GitHub 網站上的 amazon-kinesis-client
  • 在資料串流中的所有碎片中盡可能均勻地分配讀寫操作。
  • 如果您的資料串流使用超過五位取用者,請使用具有增強型散發的取用者。
  • 如果遇到 ReadProvisionedThroughputExceeded 例外狀況,請在取用者邏輯中使用錯誤重試和指數退避機制。對於使用 AWS SDK 的取用者應用程式,預設會重試請求。
AWS 官方
AWS 官方已更新 1 年前