【问题标题】:Lambda doesn't reattempt processing the SQS message even after an error is returned from the handler即使处理程序返回错误,Lambda 也不会重新尝试处理 SQS 消息
【发布时间】:2021-10-18 06:29:28
【问题描述】:

我正在尝试使用标准 SQS 调用 lambda 函数。我已经使用 try-catch 块处理了错误,只要捕获到错误,就会返回它。否则,将返回 200 OK 的响应消息。

我想重新处理返回错误的消息。但是 lambda 不会重新处理这些消息。 甚至保留时间段(5 分钟)> 可见性超时(1 分钟) 为什么会这样?

const { spawnSync, execSync } = require('child_process');
const fs = require('fs');
const { S3Client, GetObjectCommand, PutObjectCommand } = require("@aws-sdk/client-s3");
const { DynamoDBClient, UpdateItemCommand } = require("@aws-sdk/client-dynamodb");
const { marshall } = require('@aws-sdk/util-dynamodb');

exports.lambdaHandler = async (event) => {

  try {

    const body = JSON.parse(event["Records"][0]['body']);

    try {

      // Code base 1
      // All the above imported dependencies will be used here

      const response = {
        statusCode: 200,
        body: JSON.stringify({ message: "Function Executed" })
      };
    
      console.log('Response: ',response);
      return response;

    }
    catch (err) {
      console.log("[ERROR]: ", err);
      console.log('body is: ', body);
      console.log("err returning");
      return err;
    }
  }

  catch (error) {
    console.log("[ERROR]: ", error);
    console.log("error returning");
    return error;
  }

  

};


// Below functions are used in code base 1
// No try catch block or error hadling in below code bases

async function downloadFile() {
  
    //code base 2
};


async function uploadFile() {
 // code base 3
};


async function updateUsdz() {
  // code base 4
}

【问题讨论】:

  • 能贴一下你的函数代码吗?
  • @PubuduJayawardana 感谢您的回复。由于这是一个生产级代码库,因此存在一些限制。我将在上面的正文部分发布一个完善的代码库

标签: error-handling aws-lambda amazon-sqs retry-logic


【解决方案1】:

正如您所说,您实际上是在返回错误。但是,对于这种情况下的 lambda,您只是返回一个对象。对象是错误对象还是任何其他对象都没有关系。根据系统,您的 lambda 将已成功执行,SQS 服务将收到来自 AWS Lambda 的成功响应,并且消息将在处理时从队列中删除。

如果您想使用 SQS 提供的重试功能,您必须确保您的 lambda 失败。在这种情况下,这意味着在您执行了要在失败时执行的代码(例如,记录错误)之后实际上再次抛出错误。如果抛出错误,处理函数将失败(而不是简单地返回错误对象)并且消息不会从 SQS 队列中删除,而是会被重试。

例如:

exports.lambdaHandler = async (event) => {
  try {
    // Do something
  } catch (error) {
    console.log("[ERROR]: ", error);
    throw error;
  }
};

附带说明,如果您使用这样的解决方案,请确保将dead-letter queue 附加到您的 SQS 队列,以便捕获 lambda 永远无法处理的消息。如果您没有这样的队列来捕获这些消息,则会不断重试这些消息,这实际上会创建一个无限循环,这可能会花费很多钱。

【讨论】:

  • 非常感谢。有效。再次非常感谢。对于无限循环的情况,我确实更改了保留时间段,当保留时间到达时,消息将被自动删除。
  • 如果这个答案对你有帮助,请查看stackoverflow.com/help/someone-answers
猜你喜欢
  • 2019-08-19
  • 2023-03-20
  • 2021-12-05
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多