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

Yao*_*ang 6 amazon-sqs node.js aws-lambda serverless

我有这样的系统设计

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

前提条件

  1. Lambda 函数使用 try catch 块,它不会抛出任何错误。
  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 消息应该始终为零。

Aar*_*erg 0

SQS 旨在提供至少一次交付。您的消息有可能被多个 lambda 调用接收。

如果您只需要一次交付,请考虑使用fifo 队列

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