AWS - SQS 批量大小和 Lambda 方法

24

如果我理解正确,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,使重试变得相当容易。
在我的情况下,我应该使用批处理吗?天真地看,我只需要一对一的关系。换句话说,消息到达。Lambda接收它。如果出错,稍后会自动重试。
相反,我必须遍历所有的消息并尝试进行Axios请求。如果五条消息中的第三条失败了,我会抛出一个错误,Lambda就会停止。那么第四和第五条消息会发生什么?它们会被重新发送到SQS,然后再次被拾取执行吗?
2个回答

14

我只需要一对一。换句话说,消息到达。Lambda接收它。如果出错,稍后会自动重试。

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

如果五个消息中的第三个失败了,那么我会抛出一个错误并停止Lambda。消息四和五会发生什么?它们会被重新发送到SQS,然后再次被拾取以进行另一次执行吗?

如果您的Lambda出错,则消息不会从队列中删除,根据SQS的可见性超时转发策略配置,SQS将按照配置再次触发Lambda。如果您已经配置了死信队列(DLQ),则在达到maxReceiveCount之后,失败的消息将被添加到DLQ中并从主队列中删除。


在lambda中,我正在对每个处理完的消息从sqs队列进行编程式删除。这应该可以防止它重新发送已成功处理的消息。然后,如果出现任何错误,我会抛出异常来标识那些未被删除的失败消息需要重新排队。 - Ron
2
当您在10个消息的批处理中收到一个“坏”消息,并且它位于第5个位置,而我的Lambda引发了异常时会发生什么?如果我配置了DLQ,则在达到maxReceiveCount后,只有第5个消息被放置在DLQ上吗?还是消息6、7、8、9和10也会被放置在DLQ上?这将假定消息6-10在每次调用期间都与包含消息5的消息批处理相关。 - Gillfish
2
@Gillfish SQS 不知道这批 10 条信息中哪些失败了,因此它只能最终将所有 10 条信息都发送到 DLQ。如果您想要更细粒度的处理方式,但仍然使用批处理,则您的 Lambda 函数可以明确地从 SQS 队列中删除每个成功的信息,只留下未处理和失败的信息在 SQS 队列中。例如,使用 https://www.npmjs.com/package/@middy/sqs-partial-batch-failure - jarmod
SQS现在具有在队列中失败特定消息的功能 - https://dev59.com/c1MI5IYBdhLWcg3wuN-O - user11666461

2
如果五条消息中的第三条失败了,那么我会抛出一个错误并停止 Lambda。那么第四和第五个消息会发生什么?它们会被重新发送到 SQS,然后再次被选中进行另一个执行吗?
根据 AWS 文档,SQS 事件源映射现在支持开箱即用的部分失败处理。为了使其工作,您必须在 EventSourceMapping 配置中包含 ReportBatchItemFailures。所以如果五条消息中的第三条消息失败,请不要抛出异常,而是保持对失败消息的 messageId 的跟踪,然后继续处理第四和第五条消息。返回结果。
{
  "batchItemFailures": [
    { "itemIdentifier": "id3" }
  ]
}

其中id3是作为响应SQS的第三个消息的messageId。有关更多详细信息,请参阅文档和SO 帖子


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接