本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
實作部分批次回應的最佳作法
以下是設定的最佳作法適用於 Amazon SQS 事件來源的部分批次回應
-
配置一個無效字母佇列避免在無伺服器應用程式架構中建立 Snowball 反模式。如需詳細資訊,請參閱避免雪球反模式本指南的一節。
-
設定 Lambda 函數事件來源對應,只顯示失敗的訊息。要做到這一點,你必須包括值ReportBatchItemFailures在FunctionResponseTypes在設定事件來源對應時列出。如需詳細資訊,請參閱報告批次項目失敗在AWS Lambda開發者指南。
-
定義訊息移至無效字母佇列之前,要傳送至來源佇列的次數。確定您定義的值符合應用程式的使用案例,方法是識別最可能的失敗原因及其預估的復原時間。若要定義重試次數,您必須設定maxReceiveCount來源佇列上的值RedrivePolicy。如需詳細資訊,請參閱SetQueueAttributes在亞馬遜 SQS API 參考。另請參閱將 Amazon 簡單佇列服務無效字母佇列重新驅動到來源佇列
上的AWS博客。 -
確定您的 Lambda 函數程式碼為冪等
並能夠多次處理消息。這會準備函數的程式碼,以支援 Amazon SQS 訊息批次內的個別任務。一個很好的起點是合併ReportBatchItemFailures在您的事件源映射配置中。如需詳細資訊,請參閱報告批次項目失敗在AWS Lambda開發者指南。另請參閱如何防止亞馬遜 SQS 消息多次調用我的 Lambda 函數? -
考慮使用工具,例如aws-embedded-metrics
或者電動工具AWS Lambda(蟒蛇) 。這些工具可幫助您將業務指標納入函數代碼中,以跟踪失敗的作業以及這些作業的詳細信息。 -
如果您使用此功能搭配先進先出 (FIFO) 佇列,您的函數應在第一次失敗後停止處理消息,並返回所有失敗和未處理的消息
batchItemFailures
。這有助於保留佇列中訊息的順序。
注意
需要程式碼層級效能追蹤,才能追蹤使用部分批次處理之應用程式的整體效能。設定部分批次處理之後,無論批次處理的結果為何,Lambda 函數叫用幾乎都會成功。
避免雪球反模式
Lambda 和亞馬遜 SQS 無法控制上游微服務寫入 Amazon SQS 佇列的訊息。如果有無法處理的訊息,Lambda 會將這些未處理的訊息傳回至來源 Amazon SQS 佇列,除非另有無效字母佇列已設定。然後,Lambda 函數會在接下來的每個 Amazon SQS 訊息批次中重試這些未處理的訊息、失敗,然後返回要重試的佇列。如果沒有無效字母佇列,傳回 Amazon SQS 佇列的未處理訊息數目最終會超過佇列中的有效訊息。
這種類型的雪球反模式(每次連續的 Lambda 函數調用都會使問題更糟糕)可能會導致以下問題:
-
用戶體驗不佳因為工作需要比平常更長的時間來處理,或者根本不處理
-
成本增加與 Amazon SQS 佇列和訊息重試中指數增加的訊息數量成正比
-
降低應用程式或整個應用程式的 Lambda 運算AWS 帳戶如果該函數對其調用請求沒有限制
為了避免在 Amazon SQS 中設定部分批次回應時建立雪球反模式,最佳做法也是建立無效字母佇列。這個獨立佇列可以儲存未成功處理的訊息,並協助您更有效地管理應用程式未處理訊息的生命週期。
如需指示,請參閱配置無效字母隊列(控制台)在亞馬遜 SQS 開發人員指南。