【问题标题】:How to retain AWS SQS messages when error occurs in aws lambda function当aws lambda函数发生错误时如何保留AWS SQS消息
【发布时间】:2021-05-11 16:14:36
【问题描述】:

最近正在处理一个需要从 SFTP 下载文档并需要基于队列的实现的项目。

所以我选择了使用 SQS 和 lambda 的实现。每当文档进入 SFTP 时,我都会通过 web api 将文档信息推送到 SQS。在 SQS 消息正文中,我传递了文件名和其他信息。

还为 SQS 队列(使用的 FIFO 队列)创建了一个 .net core lambda 函数触发器。

public async Task FunctionHandler(SQSEvent evnt, ILambdaContext context)
{
 try
 {
     //trigger web api
     var response = GetDocumentFromSFTP(message.Body).Result;                     
 }
 catch (Exception ex)
  {
    LambdaLogger.Log("Error::" + ex.Message);
  }
}

如果在调用外部 Web api 的 GetDocumentFromSFTP() 内部发生任何错误并返回标志 true 或 false,或者其他地方如何在不删除的情况下将消息保留在 SQS 队列中以便以后可以轮询相同的消息?

请帮忙?

更新:我已将一些消息推送到队列中,它已得到处理,即使在可见性时间结束后也看不到这些消息。但是抛出错误的消息我可以查看在死信队列中。请参考下图。这是一种已知行为吗?

【问题讨论】:

标签: c# .net-core aws-lambda asp.net-core-webapi amazon-sqs


【解决方案1】:

AWS SQS 将消息保留在队列中(尽管是隐藏的),直到它被显式删除。这也适用于 AWS Lambda。在到达visibility timeout 之前,该消息将一直隐藏。

引用发现的内容here

当 Lambda 读取批次时,消息会保留在队列中,但会在队列的可见性超时长度内隐藏。如果您的函数成功处理批处理,Lambda 会从队列中删除消息。如果您的函数受到限制、返回错误或没有响应,则该消息将再次可见。失败的批处理中的所有消息都返回队列,因此您的函数代码必须能够多次处理同一消息而不会产生副作用。

您可能还想了解失败消息所在的 DLQ。这是一篇关于它的好文章:https://dev.to/piczmar_0/error-handling-in-aws-lambda-trigger-by-sqs-events-3amp

【讨论】:

  • 我已将一些消息推送到队列并得到处理。但是在轮询或可见性时间过去后我找不到这些消息,但是失败的消息在 DLQ 中可用
【解决方案2】:

在这里,我提供了指向我对类似问题的回答的链接。如果您浏览代码,则只有在消息处理中没有异常时才会执行“amazonSqs.deleteMessage”方法。您可以采用类似的方式实施,也可以发挥一些创意。

https://stackoverflow.com/a/66540960/6159869

【讨论】:

    【解决方案3】:

    当消息通过SQSEvent 发送到LAMBDA 时,如果消息被LAMBDA 函数正常处理,则SQS 会在LAMBDA 完成后立即自动删除。但是,如果处理消息时出现问题并且您不希望 SQS 删除它怎么办?抛出异常就可以了。

    更多详情请通过AWSdocumentation

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 2022-08-24
      • 2018-08-03
      • 2017-04-29
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      相关资源
      最近更新 更多