首页 > 解决方案 > 如何确保与 SQS 集成的 Lambda 调用的下游 API 在消息进入 DLQ 之前至少被调用 2 次?

问题描述

我有 lambda 使用 SQS 事件作为输入。SQS 队列也有一个 DLQ。lambda 函数调用下游 Restful API(调用此操作 DoPostToAPI())我需要保证 lambda 函数尝试调用 DoPostToAPI()至少 2 次(在消息到达 DLQ 之前)

为了完成上述要求,我需要设置什么 Lambda Retries 和 SQS Redrive 策略配置?

我需要 100% 确定到达 DLQ 的消息仅到达,因为它们已尝试发送到下游 API DoPostToAPI() 2 次,并且如果可能的话,由于任何其他原因,消息不会到达 DLQ 。

对我来说,只有在尝试操作时消息才应该到达 DLQ 是有道理的,而不是出于其他原因(即我不希望消息到达 DLQ 纯粹是因为节流,因为应该先尝试 DoPostToAPI()发送到 DLQ)如果甚至没有尝试 lambda 函数操作,我为什么要在 DLQ 上发送消息?换句话说,我需要保证在项目移动到 DLQ 之前调用 lambda 操作。

我能得到一些帮助吗?由于 DoPostToAPI() api 调用失败,是否可以保证 DLQ 上的消息已经到达?还是(更不幸的是)消息到达 DLQ 的原因可能不是对下游 API 的调用失败?

从到目前为止我在网上阅读的内容来看, lambda 在接收 SQS 消息并将消息移动到队列上的不可见之后,可能会遇到限制问题并重新尝试 lambda 调用。但是,如果它再次遇到 lambda 限制,它可能最终回到主队列,如果它达到其最大接收计数,则可以将消息放在 DLQ 上,而根本没有尝试 lambda。这个对吗?

为简单起见,让我们想象以下输入

lambda“maximum_retry_attempts”和 SQS redrive_policy“maxReceiveCount”之间的相互作用是什么

标签: amazon-web-servicesaws-lambdaamazon-sqs

解决方案


为了确保您的 lambda 在使用 SQS 时尝试重试,您只需设置 SQS 属性

maxReceiveCount

此值控制在消息进入死信队列之前对给定批次尝试多少 lambda 调用。

不幸的是,lambda 属性

maximum_retry_attempts

不适用于使用SQS作为函数事件触发器的 lambda 函数。


推荐阅读