對 Lambda 中的事件來源映射問題進行故障診斷 - AWS Lambda

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

對 Lambda 中的事件來源映射問題進行故障診斷

Lambda 中與事件來源映射相關的問題可能更為複雜,因為它們涉及跨多個 服務的偵錯。此外,事件來源行為可能會因使用的確切事件來源而有所不同。本節列出涉及事件來源映射的常見問題,並提供如何識別和故障診斷這些問題的指引。

注意

本節使用 Amazon SQS事件來源進行說明,但這些原則適用於將訊息排入 Lambda 函數佇列的其他事件來源映射。

識別和管理限流

在 Lambda 中,當您達到函數或帳戶的並行限制時,就會發生限流。請考慮下列範例,其中有從 Amazon SQS佇列讀取訊息的 Lambda 函數。此 Lambda 函數模擬 30 秒的調用,批次大小為 1。這表示函數每 30 秒只處理 1 則訊息:

const doWork = (ms) => new Promise(resolve => setTimeout(resolve, ms))

exports.handler = async (event) => {
    await doWork(30000)

}

由於呼叫時間過長,訊息開始到達佇列的速度會比處理速度更快。如果帳戶的未保留並行為 100,Lambda 最多可擴展 100 個並行執行,然後進行限流。您可以在 函數的 CloudWatch 指標中看到此模式:

除錯操作圖 10

CloudWatch 函數的 指標不會顯示錯誤,但並行執行圖表顯示已達到 100 的並行上限。因此,調節圖表會顯示調節就位。

您可以使用 CloudWatch 警示偵測限流,並在函數的限流指標大於 0 時設定警示。找出調節問題之後,您有幾個解決選項:

  • 請求此區域中 AWS 的 Support 並行增加。

  • 識別函數中的效能問題,以提高處理速度,從而改善輸送量。

  • 增加 函數的批次大小,因此每次調用都會處理更多訊息。

處理函數中的錯誤

如果處理函數擲出錯誤,Lambda 會將訊息傳回佇列SQS。Lambda 可防止函數擴展,以防止大規模錯誤。中的下列SQS指標 CloudWatch 指出佇列處理的問題:

除錯操作圖 11

特別是,最舊訊息的存留期和可見訊息的數量都在增加,而未刪除任何訊息。佇列會繼續成長,但訊息未處理。處理 Lambda 函數的 CloudWatch 指標也表示發生問題:

除錯操作圖 12

錯誤計數指標不為零且不斷增加,同時並行執行已減少且限流已停止。這顯示 Lambda 已因錯誤而停止擴展您的函數。函數的 CloudWatch 日誌提供錯誤類型的詳細資訊。

您可以透過先識別導致錯誤的函數,然後尋找並消除錯誤來解決此問題。在您修正錯誤並部署新的函數程式碼之後, CloudWatch 指標應該會顯示處理復原:

除錯操作圖 13

在這裡,錯誤計數指標會下降到零,成功率指標會恢復到 100%。Lambda 會再次開始擴展函數,如並行執行圖表所示。

識別和處理背壓

如果事件生產者持續產生SQS佇列的訊息的速度比 Lambda 函數可以處理的訊息更快,就會產生背壓。在這種情況下,SQS監控應該會顯示最舊訊息的年齡線性增長,以及大約可見的訊息數量。您可以使用 CloudWatch 警示偵測佇列中的背壓。

消除背壓的步驟取決於您的工作負載。如果主要目標是增加 Lambda 函數的處理能力和輸送量,您有幾個選項:

  • 向 AWS Support 請求在特定區域中並行增加。

  • 增加 函數的批次大小,因此每次調用都會處理更多訊息。