我在 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 的取用者應用程式,預設會重試請求。