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的可见性超时
正常工作流程
配置和代码都修正后,流程会变成:
- 4条消息入队SQS FIFO队列
- Lambda触发器根据最大并发数2,立刻启动2个Lambda实例,各处理1条消息
- 当其中一个Lambda处理完并删除消息后,触发器会马上检测到队列里还有可用消息,立刻启动新的Lambda实例处理下一条
- 重复这个过程,直到所有消息都被处理,不会出现等超时的情况
内容的提问来源于stack exchange,提问作者Guilherme
相关产品推荐
相关产品推荐

