AWS SQS – 失败的消息堵塞队列

问题描述 投票:0回答:1

我有一个通过 lambda 函数执行的长时间运行任务(10 分钟)。我的(标准)SQS 队列的可见性超时设置为 15 分钟,队列的 lambda 事件源的最大并发数为 2,没有重试(无论是在队列级别还是 lambda 上)。批量大小设置为 1。

我的问题:如果我的代码中有错误,lambda 会立即失败,但队列会在整个 15 分钟内被堵塞。我不明白为什么。

我的(显然错误的)理解: 失败的 lambda 调用将向 SQS 发出信号,表明该消息无法处理,因此该消息将被发送到配置的 DLQ,并且将立即处理下一条消息。

我的问题:如何实现,如果处理 lambda 函数出错,队列会立即继续处理下一条消息,而不是等待消息超时完成?

amazon-web-services aws-lambda amazon-sqs
1个回答
0
投票

tl;博士;你应该删除错误消息,(在 lambda 中的 IIRC,你可以吞掉错误。)

我不确定你是如何配置 lambda 的,但是 IIRC 如果你使用本机集成,你可以吞下错误,Lambda 将确认消息。

function handler(evt, ctx) {
    try {
        processEvent(evt)
    } catch (err) {
        console.log('swallowing error, so message is acked')
    }
}

在 SQS 中,有 2 个操作很重要:

receive-message
delete-message
。当您第一次开始处理消息时,请
receive
,当您完成后,您必须
delete
它。

如果您手动执行此操作,则需要添加

catch
并在 lambda 出错时将其删除,这样消息就不会仍在队列中。否则,您将开始接收消息,并且消息将在可见性超时时间内处于飞行状态。

© www.soinside.com 2019 - 2024. All rights reserved.