AWS SQS死信队列通知

时间:2019-04-15 10:26:49

标签: amazon-web-services aws-lambda amazon-sqs amazon-sns

我正在尝试设计一个基于SQS,Lambda和SNS的小型消息处理系统。如果失败,我希望将消息放入死信队列(Dead Letter Queue,DLQ)中,并调用一个Webhook。

我想知道实现这一目标的最规范或最合理的方式。

当前,如果一切顺利,则过程应如下:

  1. SQS(用于处理重试)使消息入队
  2. Lambda被SQS调用并处理消息
  3. Lambda发送一个Webhook并正常完成

如果lambda中出现问题(无法调用成功的Webhook,无法处理手头的任务),实现我想要的最简单的方法似乎是设置DLQ1,SQS会将失败的消息放入其中。然后,将调用一个辅助Lambda来处理此消息,将其传递给SNS,后者将调用故障Webhook,还将消息转发给最终/真实DLQ DLQ2。

那是最好的方法吗?

我知道的另一种选择是Alarms,尽管我已经被警告说它们非常棘手。另一个方法是,如果上次重试失败,则让lambda调用错误报告webhook,尽管这在某种程度上似乎不合适。

谢谢!

1 个答案:

答案 0 :(得分:1)

在成功的情况下,您的体系结构看起来足够好,但是我个人觉得如果出现任何问题,这非常令人困惑,因为我不明白为什么您需要两个DLQ。

在失败的情况下,我会做以下事情:

  1. 在源SQS队列上定义一个DLQ,并将maxReceiveCount设置为3,这意味着如果消息失败三遍,它们将被重定向到已配置的DLQ
  2. 创建一个监听此DLQ的Lambda。
  3. 在此Lambda中执行webhook。
  4. 由于第3步在处理完消息后自动将其从队列中删除,而且显然您希望将消息保留在某处,因此将消息的内容存储在S3上的文件中并存储文件元数据(存储桶和键)存储在DynamoDB的表中,因此您始终可以查询失败的消息。

除非您希望给定消息有多个订阅者,否则我在这里看不到SNS的任何角色,但我认为并非如此。

这样,您只需要维护一个DLQ,就可以摆脱SNS,因为它只会给您的体系结构增加一层额外的复杂性。