使用Terraform+Lambda处理SQS:为何删除消息数是接收的两倍?
SQS删除消息数量为接收数量两倍的异常排查
我通过Terraform创建了SQS服务,配置代码如下:
resource "aws_sqs_queue" "ses_queue" { name = "ses_queue" message_retention_seconds = 86400 receive_wait_time_seconds = 1 visibility_timeout_seconds = 15 } resource "aws_lambda_event_source_mapping" "send_email_message" { event_source_arn = aws_sqs_queue.ses_queue.arn function_name = aws_lambda_function.send_email_message.function_name batch_size = 5 }
我使用Lambda函数发送邮件,处理代码如下:
for record in event.get("Records"): receipt_handle = record.get("receiptHandle", "") request_body = record.get("body") response = send_email(request_body) if response: sqs_client.delete_message(QueueUrl=constants.SES_QUEUE_URL, ReceiptHandle=receipt_handle)
从监控图表可见,SQS中删除的消息数量是接收消息数量的两倍,咨询该异常的原因。
可能的原因分析:
- 消息重复处理触发重复删除:Lambda处理消息时,若
send_email执行成功,但delete_message请求因网络波动、SQS服务延迟等未收到确认,Lambda会触发重试机制重新处理同一条消息。若二次处理时send_email依然返回成功,会再次调用delete_message,导致同一条消息被成功删除两次,而SQS的Deleted Messages指标会统计所有成功的删除请求,最终出现删除数翻倍的情况。 - 可见性超时设置不合理:当前SQS的
visibility_timeout_seconds设为15秒,如果Lambda处理单条消息的时间接近或超过15秒,消息会在处理完成前重新回到队列,被再次拉取处理。若两次处理都成功触发删除操作,就会导致同一条消息被删除两次。 - 重复的Lambda事件源映射:检查是否存在多个
aws_lambda_event_source_mapping资源指向同一SQS队列和Lambda函数。若Terraform部署时重复创建了触发器,同一条消息会被多个触发器同时拉取,每条消息被处理两次,对应两次删除操作。 - 生产者重复发送消息:如果消息生产者存在重试逻辑,导致同一条消息被多次推入队列,而
Received Messages指标统计的是实际接收的消息总数(包括重复消息),但如果生产者的重复发送未被排查到,也会出现删除数与接收数的倍数关系。这种情况需要结合生产者日志进一步确认。
内容的提问来源于stack exchange,提问作者psowa001
相关产品推荐
相关产品推荐

