AWS-SQS批处理大小和Lambda方法

Ved*_*ic. 6 lambda amazon-sqs amazon-web-services

如果我理解正确,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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

有Records数组。如果我将批处理大小设置为5,那么如果SQS中有5条消息,它们将包含在数组中。如果有10条消息,则Lambda将被调用两次,每条Record中有5条消息。

现在我对采用哪种方法感到困惑。我的Lambda很简单。它将是对外部服务的Axios POST请求。如果出错,我将抛出错误。我什至可以使用axios-retry,并使重试相当容易。

我应该使用批处理吗?天真地看,我只需要1到1。换句话说,消息到了。Lambda接过。如果出错,稍后会自动重试。

相反,我将不得不遍历所有消息并尝试Axios请求。如果五个消息中的第三个失败,那我抛出一个错误并且Lambda停止了该怎么办。消息四和消息五会怎样?他们是否对SQS不满意,然后再次选择执行另一个执行?

A.K*_*han 12

我只需要 1 比 1。换句话说,消息到达。Lambda 接受了。如果出错,稍后会自动重试。

我认为在上述情况下您不需要批处理。

如果五个消息中的第三个失败,在这种情况下我会抛出错误并且 Lambda 停止,该怎么办。消息 4 和 5 会发生什么?他们是否对 SQS 感到不满,然后又被抓起来进行另一次处决?

如果您的 Lambda 错误,则不会从队列中删除消息(基于 SQS可见性超时和重新驱动策略配置)。SQS 会根据配置再次触发 Lambda。如果您已配置 DLQ,则在maxReceiveCount到达后,失败的消息将添加到 DLQ 并从主队列中删除。

  • 当您在一批 10 条消息中收到一条“坏”消息,并且它位于位置 5,并且我的 Lambda 抛出异常时,会发生什么情况。如果我配置了 DLQ,那么在达到“maxReceiveCount”后,是否仅将消息 5 放入 DLQ?或者消息 6、7、8、9 和 10 也会被放置在 DLQ 上吗?这假设在每次调用期间消息 6-10 与包含消息 5 的消息批次相关。 (2认同)
  • @Gillfish SQS 不知道这 10 个批次中哪一个失败了,因此它别无选择,只能最终将所有 10 个发送到 DLQ。如果您想要更细粒度,但仍使用批处理,那么您的 Lambda 函数可以显式删除 SQS 队列中的每条成功消息,只在 SQS 队列中保留未处理和失败的消息。例如,使用 https://www.npmjs.com/package/@middy/sqs-partial-batch-failure (2认同)