You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQS FIFO队列消息In Flight状态未及时触发Lambda处理问题咨询

问题原因

核心问题出在你的Lambda代码里多做了一步没必要的操作:手动调用sqs.receive_message()。

Lambda和SQS触发器的原生逻辑是:触发器会自动把队列里的消息推送给Lambda,不需要你再主动去拉取。你现在的代码里,触发器已经给当前Lambda实例分配了1条消息(也就是event['Records'][0]里的内容),但你又额外调用receive_message从队列里拿了另一条消息——这条被手动拉取的消息会直接进入In Flight状态,但你的代码根本没处理它,也没删除它,只能等2分钟可见性超时结束,它才会重新回到队列被处理。这就是为什么前两条处理完后,剩下两条要等超时的原因——其实它们一开始就被你的手动拉取操作“占住”了。

你的批量大小设为1、最大并发设为2的配置是对的,但代码里的手动拉取完全破坏了触发器的正常工作流程。

修正后的代码

把多余的receive_message调用删掉,直接用触发器传递过来的消息处理:

import boto3

def lambda_handler(event, context):
    print('event: ', event)
    sqs = boto3.client('sqs')
    queue_url = "https://sqs..."
    
    # 直接用触发器推过来的消息,不用手动拉取
    receipt_handle = event['Records'][0]['receiptHandle']
    print(receipt_handle)
    
    sqs.delete_message(QueueUrl=queue_url, ReceiptHandle=receipt_handle)
    
    return {
        'statusCode': 200,
        'body': 'Executions processed successfully'
    }
关键配置确认

确保以下配置没有问题:

  • SQS FIFO队列:可见性超时设置为Lambda函数执行超时的6倍以内(比如Lambda超时设30秒的话,可见性超时设3分钟就够,不用2分钟这么长,只要不超过Lambda超时的6倍都可以)
  • Lambda触发器配置:
    • 批量大小:1(保证每个Lambda实例只处理1条消息)
    • 最大并发数:2(控制同时运行的Lambda实例数量)
    • 批处理窗口:设为0(默认就是0,有消息就立即触发,不用等攒批)
  • Lambda函数配置:
    • 执行超时:根据你的处理逻辑设一个合理值(比如30秒),必须短于SQS的可见性超时
正常工作流程

配置和代码都修正后,流程会变成:

  1. 4条消息入队SQS FIFO队列
  2. Lambda触发器根据最大并发数2,立刻启动2个Lambda实例,各处理1条消息
  3. 当其中一个Lambda处理完并删除消息后,触发器会马上检测到队列里还有可用消息,立刻启动新的Lambda实例处理下一条
  4. 重复这个过程,直到所有消息都被处理,不会出现等超时的情况

内容的提问来源于stack exchange,提问作者Guilherme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:05:25