為什麼我的 Amazon DynamoDB Streams 中 Lambda IteratorAge 指標會增加?

上次更新日期:2022 年 9 月 12 日

使用 Amazon DynamoDB 串流中的記錄時,我在 AWS Lambda IteratorAge 指標中看到尖峰。為什麼我函數的反覆運算器期限增加,我該如何解決這個問題?

簡短描述

Lambda IteratorAge 指標會衡量記錄新增至 DynamoDB 串流以及與函數處理該記錄之間的延遲。當 IteratorAge 增加時,表示 Lambda 無法有效率地處理寫入 DynamoDB 串流的記錄。

這些是 IteratorAge 增加的主要原因:

  • 叫用錯誤
  • 調節發生
  • 低 Lambda 輸送量

解決方案

叫用錯誤

Lambda 設計為按順序處理批次記錄,並在錯誤時重試。因此,如果函數每次叫用時都傳回一個錯誤,那麼 Lambda 會不斷重試。其會重試直到記錄到期或超過您在事件來源映射上所設定的最長期限為止。DynamoDB 串流的保留期限為 24。Lambda 會持續重試長達一天,直到記錄過期為止,接著移至下一批記錄。

檢查 Lambda 錯誤指標,以確認叫用錯誤是否為 IteratorAge 尖峰的根本原因。如果是,請檢查 Lambda 日誌以對錯誤進行除錯,然後修改您的程式碼。當您處理錯誤時,請務必在程式碼中包含 try-catch 陳述式。

事件來源映射組態中有三個參數可協助您預防 IteratorAge 尖峰:

  • 重新嘗試次數: 當函數傳回錯誤時,Lambda 重試的次數上限。
  • 最長記錄保留期限 – Lambda 傳送至函數的記錄保留期限上限。這可協助您捨棄太老舊的記錄。
  • 錯誤時分割批次 – 當函數傳回錯誤時,請在重試之前分割為兩個批次。使用較小的批次進行重試,有助於可隔離不良記錄並解決逾時問題。注意:分割批次不會計入重試配額。

若要保留捨棄的事件,請設定事件來源映射以將失敗批次的詳細資訊傳送至 Amazon Simple Queue Service (Amazon SQS) 佇列。或者,設定事件來源映射以將詳細資訊傳送至 Amazon Simple Notification Service (Amazon SNS) 主題。若要這麼做,請使用 On-failure destination (失敗時目的) 參數。

調節發生

由於事件記錄會依序讀取,所以如果目前的叫用受到調節,Lambda 函數就無法進入下一個記錄。

使用 DynamoDB Streams 時,請勿在相同的串流碎片上設定兩個以上的取用者。如果每個碎片有兩個以上的讀者,可能會導致限流。如果單一串流碎片上需要兩個以上的讀者,請使用散發模式。將 Lambda 函數設定為使用串流中的記錄,然後將其轉發到其他下游 Lambda 函數或 Amazon Kinesis Streams。

Lambda 結束時,請使用並行限制來防止限流。

Lambda 輸送量

執行持續時間

如果 Lambda 函數的持續時間指標很高,則會降低函數的輸送量並增加 IteratorAge。

要減少函數的執行持續時間,請使用以下一或兩種方法:

1.    增加配置給函數的記憶體

2.    最佳化您的函數程式碼,以減少處理記錄所需的時間。

並行 Lambda 執行

並行 Lambda 執行的最大數目計算方式如下:

並行執行 = 碎片數 x 每個碎片的並行批次 (平行化因子)

  • 碎片數目 - 在 DynamoDB 串流中,資料表分區數目和串流碎片數目之間有 1<>1 映射。分區數目取決於資料表大小及其輸送量。資料表上的每個分區最多可提供 3,000 個讀取請求單位或 1,000 個寫入請求單位,或兩者的線性組合。因此,若要增加並行,請增加資料表的佈建容量,藉此增加碎片數量。
  • 每個碎片的並行批次 (平行化因子)-您可以在事件來源映射中設定每個碎片的並行批次數量。預設值為 1,最多可增加至 10。

例如,如果資料表有 10 個分區,且每個碎片的並行批次設定為 5,則您最多可以有 50 個並行執行。

注意:若要在任何指定時間以正確順序處理項目層級修改,具有相同分區索引鍵的項目會移至同一批次。因此,請確保您的資料表分區索引鍵具有高基數,且您的流量不會產生快捷鍵。例如,如果您將每個碎片的並行批次值設定為 10,而您的寫入流量鎖定單一分區索引鍵,則每個碎片只能有一個並行執行。

批次大小

調整批次大小值可協助您增加 Lambda 輸送量。如果您每批處理的記錄數量很少,則會降低串流的處理速度。

另一方面,如果每個批次的記錄數量很多,這可能會增加函數執行的持續時間。因此,請使用多個值進行測試,以找到適合您使用案例的最佳值。

如果函數的執行持續時間與事件中的記錄數量相互獨立,則增加函數的批處理大小會減少函數的反覆運算器期限。