Lambda会收到消费过的SQS消息吗?
Will Lambda receive SQS messages that have been consumed?
我有这样的系统设计
SQS -> 触发器 -> Lambda -> 如果失败 -> DLQ
前置条件
- 使用 try catch 块的 Lambda 函数,它不会抛出任何错误。
- Lambda 函数永远不会 运行 内存不足或超时。 (来自Lambda监控)
- Lambda 监控中的错误计数为 0
- 从不使用 SQS 控制台查看消息
- Lambda SQS batchSize 设置为 1
- DLQ 最大接收设置为 1
- Lambda 调用约 60k
运行宁了一会儿后
- 我们在 DLQ 中发现了一些消息
- DLQ 中的消息的属性 ApproximateReceiveCount 为 2 或更大。
这是预期的吗?
在我看来,如果 Lambda 中没有错误抛出,DLQ 消息应该始终为零。
SQS 旨在提供 at least once delivery。您的消息可能会被多个 lambda 调用接收。
如果您只需要一次送货,请考虑使用 fifo queue。
关于您问题的第二部分 - 为什么要将消息写入 DLQ。最简单的故障排除方法是查找与 DLQ 中 SQS 消息的某些唯一标识方面匹配的 lambda 调用日志。
我有这样的系统设计
SQS -> 触发器 -> Lambda -> 如果失败 -> DLQ
前置条件
- 使用 try catch 块的 Lambda 函数,它不会抛出任何错误。
- Lambda 函数永远不会 运行 内存不足或超时。 (来自Lambda监控)
- Lambda 监控中的错误计数为 0
- 从不使用 SQS 控制台查看消息
- Lambda SQS batchSize 设置为 1
- DLQ 最大接收设置为 1
- Lambda 调用约 60k
运行宁了一会儿后
- 我们在 DLQ 中发现了一些消息
- DLQ 中的消息的属性 ApproximateReceiveCount 为 2 或更大。
这是预期的吗?
在我看来,如果 Lambda 中没有错误抛出,DLQ 消息应该始终为零。
SQS 旨在提供 at least once delivery。您的消息可能会被多个 lambda 调用接收。
如果您只需要一次送货,请考虑使用 fifo queue。
关于您问题的第二部分 - 为什么要将消息写入 DLQ。最简单的故障排除方法是查找与 DLQ 中 SQS 消息的某些唯一标识方面匹配的 lambda 调用日志。