【问题标题】:Handle errors in lambdas triggered by SQS with batchSize > 1处理由 BatchSize > 1 的 SQS 触发的 lambda 中的错误
【发布时间】:2019-06-05 03:49:47
【问题描述】:

我设置了一个触发 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-lambda amazon-sqs


    【解决方案1】:

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

    我相信使用deleteMessageBatchReceiptHandle 删除成功消息并引发错误以使其余批次不会自动清除的相反方法可以工作,但我没有尝试删除飞行中的消息。

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-07
    • 2019-03-25
    • 2021-05-29
    • 1970-01-01
    • 2021-09-12
    • 2020-05-17
    • 2022-01-06
    相关资源
    最近更新 更多