AWS SQS 死信队列通知

AWS SQS Dead Letter Queue notifications

我正在尝试设计一个基于SQS、Lambda 和SNS 的小型消息处理系统。万一失败,我希望将消息排入死信队列 (DLQ) 并调用 webhook。

我想知道实现该目标的最规范或最合理的方式是什么。

目前如果一切顺利,流程应该是这样的:

  1. SQS(用于处理重试)将消息排队
  2. Lambda 被 SQS 调用并处理消息
  3. Lambda 发送 webhook 并正常完成

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

这是最好的方法吗?

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

谢谢!

你的架构在成功的情况下看起来足够好,但我个人觉得如果出现任何问题会非常混乱,因为我不明白为什么你需要两个 DLQ 开始。

以下是我在失败时会做的事情:

  1. 在您的源 SQS 队列上定义一个 DLQ,并将 maxReceiveCount 设置为例如3,表示如果消息失败3次,将被重定向到配置的DLQ
  2. 创建一个侦听此 DLQ 的 Lambda。
  3. 执行此 Lambda 中的 webhook。
  4. 由于步骤 3 会在处理完消息后自动从队列中删除消息,显然,您希望将消息保存在某个地方,将消息的内容存储在 S3 上的文件中并存储文件元数据 ( bucket 和 key)在 DynamoDB 的 table 中,因此您始终可以查询失败的消息。

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

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