gpt4 book ai didi

amazon-web-services - 如何防止 AWS Lambda 自动从 SQS 队列中删除消息,而是以编程方式删除它?

转载 作者:行者123 更新时间:2023-12-05 03:49:36 25 4
gpt4 key购买 nike

当文件添加到我的 S3 存储桶时,将触发 S3PUT 事件,将消息放入 SQS。我已将 Lambda 配置为在消息可用时立即触发。

在 lambda 函数中,我发送了一个 API 请求以在 ECS Fargate 容器上运行一个任务,该容器的环境变量包含从 SQS 收到的消息。在容器中,我使用消息从 S3 下载文件,进行处理,在成功处理后,我希望从 SQS 中删除消息。

但是,在我的 lambda 执行后,消息会自动从 SQS 中删除。有什么方法可以将 lambda 配置为不自动删除 SQS 消息(除了引发异常并故意使 lambda 失败),以便我可以编程方式从我的容器中删除消息?

更新:考虑我希望实现的这种情况。

  1. 消息进入SQS队列
  2. Lambda 获取消息并运行 ECS API 并在不从队列中删除消息的情况下完成。
  3. 正在发送消息。
  4. ECS 容器运行任务并在成功处理后从队列中删除消息。如果容器失败,在可见性超时后,消息将重新进入队列,lambda 将再次被触发,循环将从步骤 1 开始重复。
  5. 如果容器失败超过一定次数,消息才会从运行中发送到 DLQ。

只有当我故意在 lambda 上引发异常并且我正在寻找类似的解决方案而不这样做时,这一切目前才有效。

最佳答案

该行为是有意为之的,只要将 SQS 配置为 Lambda 触发器,一旦函数返回(即完成执行),消息就会自动删除。

在我看来,要实现您所描述的行为,您有 4 个选择:

  • 删除 SQS 作为 Lambda 触发器,而是按计划执行 Lambda 函数并自行轮询队列。 lambda 将读取可用的消息,但除非您明确删除它们,否则一旦它们的可见性超时过期,它们将再次可用。您可以通过 CloudWatch 计划实现这一目标。
  • 删除 SQS 作为 Lambda 触发器,而是显式执行 Lambda 函数。与上述类似,但不是始终按计划执行,Lambda 函数可以由消息的生成者本身触发。
  • 保留 SQS Lambda 触发器并将消息存储在备用 SQS 队列中(如@jarmod 在上面的评论中所建议的那样)。
  • 配置消息的生产者以将消息发布到 SNS 主题并将 2 个 SQS 队列订阅到该主题。两个队列之一将触发 Lambda 函数,另一个将由您的 ECS 任务使用。

更新

根据提供的新信息,您还有另一种选择:

保持事件流不变,让Lambda删除SQS中的消息。然后,在您的 ECS 任务中,处理失败状态并在 SQS 中放入一条具有相同负载/正文的新消息。这将允许您无限期地重试。

SQS 消息没有理由必须完全相同,您感兴趣的是正文/有效负载。

您可能需要考虑添加一种机制来限制这些重试并将消息发布到 DLQ。

关于amazon-web-services - 如何防止 AWS Lambda 自动从 SQS 队列中删除消息,而是以编程方式删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63850119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com