首页 > 解决方案 > 处理由 BatchSize > 1 的 SQS 触发的 lambda 中的错误

问题描述

我设置了一个触发 lambda 函数的 AWS SQS 队列。作为默认行为,一次最多可以触发 10 条消息(默认 batchSize)。

如果 lambda 由于任何原因失败,它将失败整个批次并最终重试。但是假设我有一封发送 lambda 的电子邮件,它在前 N 个案例中成功执行,但在 N+1 中失败。如果它重试整个批次,它将重复电子邮件。

目前我只能想到将batchSize 1 来避免这个问题,但我希望能避免它。还有另一种方法吗?

节点代码非常简单,如下所示:

exports.handler = async event => {
  try {
    await Promise.all(
      event.Records.map(async record => {
        // SEND EMAIL ASYNC
      });
    );
  } catch (error) {
    [...];
    throw error;
  }
}

标签: aws-lambdaamazon-sqs

解决方案


解决此问题的一种方法是跟踪哪些消息成功和哪些失败(在您的 map 函数中完成),并在 catch 部分将失败的消息(可以通过 定位ReceiptHandle)重新添加到队列中。然后不是抛出错误,而是成功返回,这将导致整个批次从队列中清除。

我相信删除成功的消息和抛出错误以使批处理的其余部分不会自动清除的deleteMessageBatch相反ReceiptHandle可能有效,但我没有尝试删除飞行中的消息。

来自https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html

当 Lambda 从队列中读取消息时,它会保留在队列中,但会隐藏,直到 Lambda 将其删除。如果您的函数返回错误,或者在队列的可见性超时之前未完成处理,则它会再次可见。


推荐阅读