簡體   English   中英

AWS - SQS 批量大小和 Lambda 方法

[英]AWS - SQS Batch Size and Lambda approach

如果我理解正確,Lambda 上的批量大小設置決定了從 SQS 一次掃描中接收多少條消息。 因此這個 JSON(取自測試 Lambda SQS);

{
  "Records": [
    {
      "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
      "receiptHandle": "MessageReceiptHandle",
      "body": "FAIL",
      "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1523232000000",
        "SenderId": "123456789012",
        "ApproximateFirstReceiveTimestamp": "1523232000001"
      },
      "messageAttributes": {
      },
      "md5OfBody": "7b270e59b47ff90a553787216d55d91d",
      "eventSource": "aws:sqs",
      "eventSourceARN": "arn:aws:sqs:eu-west-1:123456789012:MyQueue",
      "awsRegion": "eu-west-1"
    }
  ]
}

有記錄數組。 如果我將批量大小設置為 5,那么如果 SQS 中有 5 條消息,它們將包含在數組中。 如果有 10 條消息,則 Lambda 將被調用兩次,每條記錄中有 5 條消息。

我現在有點困惑,至於采取什么方法。 我的 Lambda 相當簡單。 它將是對外部服務的 Axios POST 請求。 如果它出錯,我會拋出一個錯誤。 我什至可以使用 axios-retry,讓重試變得相當容易。

我應該在我的情況下使用批處理嗎? 天真地看着,我只需要1對1。換句話說,消息到達。 拉姆達接受它。 如果出錯,稍后會自動重試。

相反,我將不得不遍歷所有消息並嘗試 Axios 請求。 如果五條消息中的第三條失敗了怎么辦,在這種情況下我會拋出一個錯誤並且 Lambda 會停止。 消息四和五會發生什么? 他們是否被重新發送到 SQS,然后再次被拾起以進行另一次執行?

我只需要1對1。換句話說,消息到達。 拉姆達接受它。 如果出錯,稍后會自動重試。

在上述情況下,我認為您不需要批處理。

如果五條消息中的第三條失敗了怎么辦,在這種情況下我會拋出一個錯誤並且 Lambda 會停止。 消息四和五會發生什么? 他們是否被重新發送到 SQS,然后再次被拾起以進行另一次執行?

如果您的 Lambda 錯誤,則不會從隊列中刪除消息,這取決於 SQS 可見性超時和重新驅動策略配置。 SQS 會根據配置再次觸發 Lambda。 如果您已配置 DLQ,則在達到maxReceiveCount后,失敗的消息將被添加到 DLQ 並從主隊列中刪除。

如果五條消息中的第三條失敗了怎么辦,在這種情況下我會拋出一個錯誤並且 Lambda 會停止。 消息四和五會發生什么? 他們是否被重新發送到 SQS,然后再次被拾起以進行另一次執行?

根據 AWS 文檔,SQS 事件源映射現在支持開箱即用地處理部分故障。 為此,您必須在EventSourceMapping配置中包含ReportBatchItemFailures 因此,如果五條消息中有三分之一失敗,則不要拋出異常,而是跟蹤失敗消息的 messageId 並繼續處理第 4 條和第 5 條消息。 返回

{
  "batchItemFailures": [
    { "itemIdentifier": "id3" }
  ]
}

其中 id3 是作為對 SQS 的響應的第三條消息的 messageId。 有關更多詳細信息,請參閱文檔和 SO帖子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM