AWS SQS死信队列通知

6

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

我想知道实现这个目标最典型或合理的方式是什么。

目前,如果一切顺利,流程应该如下:

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

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

那是最好的方案吗?

我知道的一个替代方案是Alarms,但我被警告说它们相当棘手。另一个方案是,如果最后一次重试失败,让lambda调用错误报告webhook,尽管这似乎不太合适。谢谢!
1个回答

11

如果一切顺利,您的架构看起来已经足够好了,但如果出现问题,我个人认为它会相当令人困惑,因为我不知道为什么您需要两个DLQ。

以下是我在发生故障时会做的事情:

  1. 在源SQS队列上定义一个DLQ,并将maxReceiveCount设置为例如3,这意味着如果消息失败三次,它们将被重定向到配置的DLQ
  2. 创建一个Lambda,监听此DLQ。
  3. 在此Lambda中执行webhook。
  4. 由于第3步在处理完消息后会自动从队列中删除该消息,而显然您希望将消息持久化存储在某些地方,所以请将消息内容存储在S3上的文件中,并将文件元数据(bucket和key)存储在DynamoDB表中,这样您就始终可以查询失败的消息。

我不认为SNS在这里有任何作用,除非您希望为给定消息拥有多个订阅者,但据我所见,这不是情况。

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


1
谢谢@Thales Minussi,听起来很合理。在接受之前,我会再等一会儿看看是否还有其他人有什么要说的。 - Jan Benes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接