如果我理解正确,那么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"
}
]
}
有Records数组。如果我将批处理大小设置为5,那么如果SQS中有5条消息,它们将包含在数组中。如果有10条消息,则Lambda将被调用两次,每条记录中有5条消息。
我现在对采取什么方法感到困惑。我的Lambda很简单。它将是对外部服务的Axios POST请求。如果出错,我将抛出错误。我什至可以使用axios-retry,并使重试相当容易。
我应该使用批处理吗?天真地看,我只需要1到1。换句话说,消息到了。 Lambda接过。如果出错,稍后会自动重试。
相反,我将不得不遍历所有消息并尝试Axios请求。如果五个消息中的第三个失败,那我抛出一个错误并且Lambda停止了该怎么办。消息四和消息五会怎样?他们会重新发送SQS,然后再次选择执行另一次执行吗?
答案 0 :(得分:3)
我所需要的只是1到1。换句话说,消息到达了。 Lambda需要 它。如果出错,稍后会自动重试。
在上述情况下,我认为您不需要批处理。
根据SQS visibility timeout和redrive policy的配置,如果您的Lambda错误,如果五个消息中的第三个失败了,在这种情况下,我会抛出一个 错误,Lambda停止。消息四和消息五会怎样? 他们会重新发送SQS,然后再次选择执行另一次执行吗?
不会从队列中删除消息。 SQS将根据配置再次触发Lambda。如果您已配置DLQ,则在到达maxReceiveCount
之后,失败的消息将被添加到DLQ并从主队列中删除。