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

问题描述

在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

通常,当Amazon SNS由于客户端或服务器端错误而无法访问预订的终端节点时,消息传递失败。

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

在标准重试策略(两次失败重试)用完后,AWS Lambda将调用Lambda函数的事件对象写入此[DLQ]端点。

Lambda:

lamda dlq

SNS订阅

enter image description here

解决方法

SNS DLQ专用于SNS,这样做的好处是它还解决了客户端错误,例如Lambda服务关闭。这样可以确保如果Lambda服务关闭,则消息可以稍后重播,而如果DLQ连接到Lambda,则仅在服务运行时才考虑重播。

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

两个服务都将SQS用于其DLQ,因此两者的接收/检索将是相同的。如果您在两个服务上都具有DLQ,则可以,您可能会得到事件/通知的2个副本,但是,按照理论上Lambda端点承认SNS将其视为已发送,您将不太可能同时获得这两个副本Lambdas有责任在失败时添加到DLQ。