Lambda会收到消费过的SQS消息吗?

Will Lambda receive SQS messages that have been consumed?

我有这样的系统设计

SQS -> 触发器 -> Lambda -> 如果失败 -> DLQ

前置条件

  1. 使用 try catch 块的 Lambda 函数,它不会抛出任何错误。
  2. Lambda 函数永远不会 运行 内存不足或超时。 (来自Lambda监控)
  3. Lambda 监控中的错误计数为 0
  4. 从不使用 SQS 控制台查看消息
  5. Lambda SQS batchSize 设置为 1
  6. DLQ 最大接收设置为 1
  7. Lambda 调用约 60k

运行宁了一会儿后

  1. 我们在 DLQ 中发现了一些消息
  2. DLQ 中的消息的属性 ApproximateReceiveCount 为 2 或更大。

这是预期的吗?

在我看来,如果 Lambda 中没有错误抛出,DLQ 消息应该始终为零。

SQS 旨在提供 at least once delivery。您的消息可能会被多个 lambda 调用接收。

如果您只需要一次送货,请考虑使用 fifo queue

关于您问题的第二部分 - 为什么要将消息写入 DLQ。最简单的故障排除方法是查找与 DLQ 中 SQS 消息的某些唯一标识方面匹配的 lambda 调用日志。