我有一个通过 lambda 函数执行的长时间运行任务(10 分钟)。我的(标准)SQS 队列的可见性超时设置为 15 分钟,队列的 lambda 事件源的最大并发数为 2,没有重试(无论是在队列级别还是 lambda 上)。批量大小设置为 1。
我的问题:如果我的代码中有错误,lambda 会立即失败,但队列会在整个 15 分钟内被堵塞。我不明白为什么。
我的(显然错误的)理解: 失败的 lambda 调用将向 SQS 发出信号,表明该消息无法处理,因此该消息将被发送到配置的 DLQ,并且将立即处理下一条消息。
我的问题:如何实现,如果处理 lambda 函数出错,队列会立即继续处理下一条消息,而不是等待消息超时完成?
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 出错时将其删除,这样消息就不会仍在队列中。否则,您将开始接收消息,并且消息将在可见性超时时间内处于飞行状态。