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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:55:39