本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Lambda 如何處理來自串流和佇列型事件來源的記錄
事件來源映射是一種 Lambda 資源,可從串流和佇列型服務讀取項目,並使用批次記錄叫用函數。下列服務使用事件來源映射來叫用 Lambda 函數:
警告
Lambda 事件來源映射至少會處理每個事件一次,而且可能會發生重複的記錄處理。為了避免與重複事件相關的潛在問題,我們強烈建議您讓函數程式碼變得不容錯過。若要進一步了解,請參閱 AWS Knowledge Center 中的如何使 Lambda 函數成為同位
事件來源映射與直接觸發程序有何不同
某些 AWS 服務可以使用 觸發程序 直接叫用 Lambda 函數。這些服務會將事件推送至 Lambda,並在發生指定事件時立即叫用 函數。觸發條件適用於離散事件和即時處理。當您使用 Lambda 主控台 建立觸發條件時,主控台會與對應的 AWS 服務互動,以設定該服務上的事件通知。觸發程序實際上是由產生事件的服務儲存和管理,而不是由 Lambda 儲存和管理。以下是一些使用觸發程序來叫用 Lambda 函數的服務範例:
-
Amazon Simple Storage Service (Amazon S3):在儲存貯體中建立、刪除或修改物件時叫用 函數。如需詳細資訊,請參閱教學課程:使用 Amazon S3 觸發條件調用 Lambda 函數。
-
Amazon Simple Notification Service (Amazon SNS):在訊息發佈至SNS主題時叫用 函數。如需詳細資訊,請參閱教學課程: AWS Lambda 搭配 Amazon Simple Notification Service 使用。
-
Amazon API Gateway:在對特定端點提出API請求時叫用函數。如需詳細資訊,請參閱使用 Amazon API 閘道端點叫用 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,因此批次間隔提前結束。在第三種情況下,承載大小在批次間隔到期之前達到最大值,因此批次間隔提前結束。
建議您使用不同的批次和記錄大小進行測試,以便調整每個事件來源的輪詢頻率,以適應您的函數完成其任務的速度。CreateEventSourceMapping BatchSize 參數控制每次調用時可傳送至函數的記錄數目上限。更大的批次大小通常會更有效吸收更大集合的記錄的呼叫成本,增加您的傳輸量。
Lambda 不會等待任何設定的延伸模組完成,然後再傳送下一個批次進行處理。換句話說,當 Lambda 處理下一批記錄時,您的擴充功能可能會繼續執行。如果您違反任何帳戶的 並行 設定或限制,便可能會產生限流的問題。若要偵測此是否為潛在問題,請監控您的函數,並確認您看到的 並行指標 是否高於事件來源映射的預期值。由於兩次調用之間的時間很短,Lambda 可能會短暫報告比碎片數目更高的並行用量。即使對於沒有延伸項目的 Lambda 函數也可能如此。
根據預設,如果您的函數傳回錯誤,則事件來源映射會重新處理整個批次,直到函數成功,或批次中的項目過期為止。若要確保依序處理,事件來源映射會暫停處理受影響的碎片,直到錯誤解決為止。針對串流來源 (DynamoDB 和 Kinesis),您可以設定函數傳回錯誤時 Lambda 重試的次數上限。導致批次未抵達函數的服務錯誤或限流不會計入重試嘗試次數。您也可以設定事件來源映射,以便在捨棄事件批次時將調用記錄傳送至目的地。
事件來源映射 API
若要使用 AWS Command Line Interface (AWS CLI) 或 管理事件來源AWS SDK