我想知道為什麼我的 Amazon Kinesis 資料串流在取得資料記錄時延遲高。
簡短描述
如果每個 GET 請求的記錄數或記錄大小增加,GetRecords.Latency 可能會增加。如果您在生產者將資料擷取到串流時重新啟動應用程式,則記錄可以累積而不會消耗。記錄計數或要擷取的資料量的這種增加會增加 GetRecords.Latency 的值。如果應用程式無法跟上擷取速率,則 IteratorAge 會增加。
**注意:**在 Kinesis 資料串流上開啟伺服器端加密可能會增加延遲。
解決方法
使用 Amazon CloudWatch 監控 Kinesis 資料串流服務。檢查 CloudWatch 指標 (例如 GetRecords.Latency),以確認延遲增加是否持續。如果延遲增長是持續的,請檢查 CloudWatch 中的 IncomingRecords、IncomingBytes、GetRecords.Records 和 GetRecords.Bytes 是否也有增加。隨著資料量增加,這些指標會增加並導致高延遲。這種增加是因為,當 Kinesis 資料串流中有更多可用的記錄時,GetRecords 會擷取更多記錄。
如果您的 IteratorAge 也增加,則可能會有更多 IncomingBytes 放入串流中。檢查 CloudWatch 中的 IncomingBytes 指標,以確認位元組數是否增加。您可以檢查對串流的 GetRecords 呼叫是否減少。傳入位元組更多表示每個 GetRecords 呼叫在擷取更多資料,從而增加 GetRecords.Latency 的值。
如果您仍然觀察到高延遲 (即使 IncomingBytes 或 IncomingRecords 沒有增加),則表示傳入的資料可能太多。如果消費者應用程式無法跟上傳入資料的速度,則資料會繼續累積在 Kinesis 資料串流中。即使重新啟動應用程式,每個 GetRecords 呼叫中也會擷取更多記錄。然後,每個 GetRecords 呼叫的記錄或擷取資料的增加會增加 GetRecords.Latency 的值。
若要解決此問題,請完成下列步驟:
- 檢查您的應用程式,查看是否已進行足夠的 GetRecords 呼叫來處理傳入資料量。如果您使用 Amazon Kinesis Client Library (KCL) 應用程式或 AWS Lambda 作為消費者,請增加串流中的碎片數量。碎片數的增加會增加傳遞串流的消耗速率,並減小 IteratorAge 和 GetRecords.Latency 的值。
- 延長 Kinesis 資料串流的保留期間,以避免任何資料丟失。較長的保留期間有助於應用程式跟上資料積壓的速度。
- 如果您有消費者應用程式,請檢查處理邏輯並記錄處理時間。
- 檢查系統的中央處理單元 (CPU) 和記憶體使用率,以查看是否需要釋放更多記憶體。