我想知道為什麼我的 Amazon DynamoDB Streams 需要這麼長時間才能處理。
解決方法
當您透過 AWS Lamdba 來使用 DynamoDB 串流時,您可能會有記錄寫入資料表,但 Lambda 不會處理這些記錄。處理這些記錄甚至可能需要幾個小時。若要對原因進行疑難排解,請查看 Lambda IteratorAge 指標。
當 IteratorAge 增加時,Lambda 無法有效處理寫入 DynamoDB 串流的記錄。IteratorAge 可能因以下原因增加。
調用錯誤
Lambda 的設計目的是依序處理批次記錄,然後在發生錯誤時重試。如果每次調用函數時都傳回錯誤,則 Lambda 函數將繼續嘗試處理記錄。此函數將繼續嘗試處理記錄,直到記錄過期或記錄超過事件來源映射上設定的最長期限。由於沒有處理串流中的記錄,因此 IteratorAge 指標可能會激增。您可以在錯誤指標中查看 Lambda 錯誤指標是否激增。或者,查看 Lambda 日誌以取得更多資訊。
為了防止調用錯誤導致 IteratorAge 指標激增,請將記錄傳送到無效字母佇列 (DLQ)。建立事件來源映射時,請輸入以下特定參數資訊:
- 重試次數: 此參數是當函數出現錯誤時,Lambda 函數執行的次數。根據您的使用情況更新此值,並在函數重試特定次數後將記錄傳送至 DLQ。
- 發生錯誤時分割批次: 在函數重試該批次之前,此參數會將一個批次分割為兩個批次。使用此參數分割批次,並以較小的批次繼續調用。分割批次可以幫助隔離導致調用錯誤的不良記錄。
限流錯誤
當您使用 DynamoDB 串流時,最佳做法是每個碎片的取用者不超過兩個,以避免限流。由於 Lambda 會依序處理記錄,因此如果目前調用受到限流,Lambda 就無法繼續處理記錄。如果必須使用兩個以上的取用者,請使用 Amazon Kinesis 或扇出模式。或者,使用 Lambda 中的並行限制來防止限流。
Lambda 輸送量
Lambda 輸送量是一次調用 lambda 函數來處理一筆或一批記錄所需的時間。下列因素可能會影響 Lambda 函數的輸送量:
執行時期持續時間
如果持續時間指標值較高,則函數的輸送量較低,從而導致函數的 IteratorAge 指標增加。若要減少函數的執行時期,請增加分配給函數的記憶體。
您也可以最佳化您的函數代碼,以減少處理記錄所需的時間。
並行的 Lambda 執行
並行是 Lambda 函數同時處理傳輸中請求的數量。增加並行 Lambda 呼叫的數量可以改善串流記錄的處理。對於每個並行請求,Lambda 都會為您的執行環境提供一個單獨的執行個體。並行的 Lambda 執行最大次數計算如下:
並行執行 = 碎片數 x 每個碎片的並行批次 (平行化因子)
在 DynamoDB 串流中,資料表的分區數量與串流碎片數量是一對一對應的。分區的數量是由資料表的大小及其輸送量決定。資料表上的每個分區最多可提供 3,000 個讀取請求單位或 1,000 個寫入請求單位,或兩者的線性組合。因此,若要增加並行,請提高資料表的佈建容量來增加碎片數量。您可以在事件來源映射中設定每個碎片的並行批次數量。預設值是 1,最多可增加至 10。例如,如果資料表有 10 個分區,且每個碎片的並行批次設定為 5,則您最多可以有 50 個並行執行。
若要在任何時間點以正確的順序處理項目層級的修改,具有相同分區索引鍵的項目會進入同一批次。您的資料表分區索引鍵必須具有高基數,而且流量不會產生快捷鍵。例如,如果您將每個碎片的並行批次值設定為 10,而您的寫入流量針對單一分區索引鍵,則每個碎片只能有一個並行執行。
批次大小和批次時間段
如果沒有正確調整,Lambda 批次行為可能會降低函數的輸送量。若要最佳化 DynamoDB 串流的處理,請根據您的使用案例調整批次時間段和批次大小。
如果批次大小設定得太低,那麼函數就會頻繁使用少量記錄來調用。這些頻繁的呼叫會減慢串流的處理速度。如果批次大小值設定得太高,那麼函數持續時間可能會增加。
如果批次時間段值和該時間段中的記錄數未最佳化,則可能會對同一碎片進行不必要的調用。這些不必要的調用會減慢串流的處理速度。如果批次時間段值太高,那麼函數處理串流所需的等待時間可能會更長。這種更長的處理時間會增加 IteratorAge。
為了增加輸送量並降低 IteratorAge,最佳做法是測試多個批次時間段和批次大小的組合。
相關資訊
效能指標
了解 Lambda 擴展和輸送量
了解 Lambda 函數擴展
使用 DynamoDB Streams Amazon Kinesis Adapter 來處理串流記錄
DynamoDB Streams 和 Lambda 觸發器