繁体   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