AWS - 在 SNS 订阅或 Lambda 函数上设置死信队列有什么区别?

AWS - What is the difference between setting a Dead Letter Queue on an SNS Subscription or on a Lambda function?

在 SNS 主题或 Lambda 函数上设置死信队列有什么区别?

我想知道,因为如果您在 SNS 订阅上设置 DLQ,那么当 Lambda(订阅者)出现故障时,该订阅消息将故障转移到 DLQ,对吗?那么在那种情况下,在这两个地方设置DLQ是否会产生相同的效果?

我在 SNS 主题订阅上设置了 DLQ,它并没有“自动”显示为 Lambda 屏幕设置上的 DLQ,所以我认为可能存在一些差异?

SNS 死信队列参考:https://docs.aws.amazon.com/sns/latest/dg/sns-dead-letter-queues.html

In general, message delivery fails when Amazon SNS can't access a subscribed endpoint due to a client-side or server-side error.

Lambda 死信队列参考:https://aws.amazon.com/about-aws/whats-new/2016/12/aws-lambda-supports-dead-letter-queues/

AWS Lambda will write the event object invoking the Lambda function to this [DLQ] endpoint after the standard retry policy (2 additional retries on failure) is exhausted.

拉姆达:

SNS 订阅:

SNS DLQ 是特定于 SNS 的,这里的好处是它还可以解决客户端错误,例如 Lambda 服务已关闭。这将确保如果 Lambda 服务关闭,消息可以稍后重播,而如果 DLQ 附加到 Lambda,这将仅在服务为 运行.

时才考虑重播。

然而,正如我提到的,SNS DLQ 仅适用于来自 SNS 的通知,而 Lambda 可以支持来自任何传入事件的 DLQ。这意味着如果您有多个 SNS 主题,或者一个 SNS 主题和一些 SQS 队列,您只需将它应用到 Lambda 本身。

两种服务都使用 SQS 作为其 DLQ,因此两者的 ingestion/retrieval 是相同的。如果您在这两种服务上都有 DLQ 那么是的,您最终可能会得到 event/notification 的 2 个副本,但是您不太可能同时获得这两个副本,因为理论上 Lambda 端点会承认 SNS 会将其视为已发送,这如果失败,Lambda 将负责添加到 DLQ。

SNS DLQ 和 Lambda DLQ 保护您的工作负载免受不同故障模式的影响。前者用于主题消息传递失败,而后者用于函数执行失败。您应该同时使用两者。这里有更多信息:https://aws.amazon.com/blogs/compute/designing-durable-serverless-apps-with-dlqs-for-amazon-sns-amazon-sqs-aws-lambda/