Lambda 如何處理來自串流和佇列式事件來源的記錄 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Lambda 如何處理來自串流和佇列式事件來源的記錄

事件來源映射是 Lambda 資源,可從串流和佇列式服務讀取項目,並使用成批的記錄來調用函數。在事件來源映射中,名為事件輪詢器的資源會主動輪詢新訊息並調用函數。依預設,Lambda 會自動擴展事件輪詢器,但對於某些事件來源類型,可以使用佈建模式來控制專用於事件來源映射的事件輪詢器數量下限和上限。

下列服務使用事件來源映射調用 Lambda 函數:

警告

Lambda 事件來源映射至少會處理每個事件一次,而且可能會重複處理記錄。為避免與重複事件相關的潛在問題,強烈建議您讓函數程式碼具有等冪性。若要進一步了解,請參閱 AWS 知識中心中的如何使 Lambda 函數成為等冪。

事件來源映射與直接觸發條件有何不同

有些 AWS 服務 可以使用觸發程序直接叫用 Lambda 函數。這些服務會將事件推送至 Lambda,並在發生指定事件時立即調用函數。觸發條件適用於離散事件和即時處理。當您使用 Lambda 主控台建立觸發時,主控台會與對應的 AWS 服務互動,以設定該服務上的事件通知。觸發條件實際上由產生事件的服務 (而非 Lambda) 儲存和管理。以下是一些使用觸發條件調用 Lambda 函數的服務範例:

事件來源映射是在 Lambda 服務內建立和管理的 Lambda 資源。事件來源映射旨在處理來自佇列的大量串流資料或訊息。批次處理來自串流或佇列的記錄比個別處理記錄更有效率。

批次處理行為

根據預設,事件來源映射會將記錄批次處理到 Lambda 傳送給函數的單個承載中。若要微調批次處理行為,可以設定一個批次間隔 (MaximumBatchingWindowInSeconds) 和批次大小 (BatchSize)。批次間隔是將記錄收集到單一承載的最長時間。批次大小是單一批次中記錄的最大數目。當下列三個條件之一成立時,Lambda 會調用您的函數:

  • 批次間隔達到其最大值。預設批次間隔行為會有所不同,這取決於特定的事件來源。

    • 對於 Kinesis、DynamoDB 和 Amazon SQS 事件來源:預設批次間隔為 0 秒。這表示 Lambda 會在記錄可用時立即調用函數。若要設定批次處理間隔,請設定 MaximumBatchingWindowInSeconds。可以將此參數設定為從 0 秒到 300 秒之間的任意值,增量為 1 秒。如果設定批次處理間隔,則在上一個函數調用完成時開始下一個批次處理間隔。

    • 如果事件來源是 Amazon MSK、自主管理 Apache Kafka 、Amazon MQ 以及 Amazon DocumentDB:預設批次處理時段為 500 毫秒。您可以將 MaximumBatchingWindowInSeconds 設定為從 0 秒到 300 秒之間的任意值,增量為秒。一旦第一條記錄到達,批次間隔就會開始。

      注意

      因為您只能以秒為增量變更 MaximumBatchingWindowInSeconds,所以在變更之後無法恢復到 500 毫秒的預設批次處理間隔。要恢復預設批次間隔,必須建立新的事件來源映射。

  • 已滿足批次大小。批次大小下限為 1。預設和最大批次大小取決於事件來源。如需這些值的詳細資訊,請參閱 CreateEventSourceMapping API 操作的 BatchSize 規格。

  • 承載大小達到 6 MB您無法修改此限制。

下圖說明了這三種情況。假設批次間隔從第 t = 7 秒開始。在第一種情況下,批次間隔在累積 5 條記錄後在第 t = 47 秒達到其最大值 40 秒。在第二種情況下,批次大小在批次間隔到期之前達到 10,因此批次間隔提前結束。在第三種情況下,承載大小在批次間隔到期之前達到最大值,因此批次間隔提前結束。

當達到最大時間、符合批次大小或承載達到 6 MB 時,批次處理間隔會過期

建議使用不同的批次與記錄大小測試,讓每個事件來源的輪詢頻率調整為函數可以多快完成作業。CreateEventSourceMapping 批次大小參數控制每次呼叫時能傳送至您函數的記錄上限。更大的批次大小通常會更有效吸收更大集合的記錄的呼叫成本,增加您的傳輸量。

Lambda 在傳送下一批進行處理前不會等待任何已設定的擴充完成。換句話說,當 Lambda 處理下一批記錄時,您的擴充功能可能會繼續執行。如果您違反任何帳戶的 並行 設定或限制,便可能會產生限流的問題。若要偵測此是否為潛在問題,請監控您的函數,並確認您看到的 並行指標 是否高於事件來源映射的預期值。由於兩次調用之間的時間很短,Lambda 可能會短暫報告比碎片數目更高的並行用量。即使對於沒有延伸項目的 Lambda 函數也可能如此。

根據預設,如果您的函數傳回錯誤,則事件來源映射會重新處理整個批次,直到函數成功,或批次中的項目過期為止。若要確保依序處理,事件來源映射會暫停處理受影響的碎片,直到錯誤解決為止。針對串流來源 (DynamoDB 和 Kinesis),您可以設定函數傳回錯誤時 Lambda 重試的次數上限。導致批次未抵達函數的服務錯誤或限流不會計入重試嘗試次數。您也可以設定事件來源映射,在捨棄事件批次時將調用記錄傳送至目的地

佈建模式

Lambda 事件來源映射使用事件輪詢器來輪詢您的事件來源,以取得新訊息。預設情況下,Lambda 會根據訊息量來管理這些輪詢器的自動擴充。當訊息流量增加時,Lambda 會自動增加事件輪詢器的數量以處理負載,並在流量減少時減少輪詢器。

在佈建模式中,您可以透過定義佈建事件輪詢器數量的下限和上限,微調事件來源映射的輸送量。然後,Lambda 會以回應的方式,在事件輪詢器數量下限和上限之間擴展事件來源映射。這些佈建的事件輪詢器專用於您的事件來源映射,可增強您應對事件中不可預測尖峰的能力。

在 Lambda 中,事件輪詢器是運算單元,能夠處理高達 5 MBps 的輸送量。做為參考,假設您的事件來源產生的平均承載為 1 MB,平均函數持續時間為 1 秒。如果承載未進行任何轉換 (例如篩選),則單一輪詢器可以支援 5 MBps 輸送量和 5 個並行 Lambda 調用。使用佈建模式會產生額外費用。如需定價預估,請參閱 AWS Lambda 定價

佈建的模式僅支援 Amazon MSK 和自我管理的 Apache Kafka 事件來源。雖然並行設定可讓您控制函數的擴展,但佈建的模式可讓您控制事件來源映射的輸送量。為確定效能最大化,您可能需要單獨調整這兩個設定。如需設定佈建模式的詳細資訊,請參閱下列章節:

設定佈建模式後,可以透過監控 ProvisionedPollers 指標來觀察工作負載的事件輪詢器使用情況。如需詳細資訊,請參閱事件來源映射指標

事件來源映射 API

若要使用 AWS Command Line Interface (AWS CLI)AWS SDK 來管理事件來源,可以使用下列 API 操作: