AWS SNS消息生存期

时间:2017-01-13 09:37:18

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

我有一个用例,我需要Amazon SNS发送通知,直到我的应用程序(让我们称之为APP)成功收到它,但文档说消息的最长生命周期可能是1小时。

假设APP崩溃,并且无法在1小时内将其恢复正常。我仍然需要以某种方式接收这些消息。

有多种方法可以实现它:

  1. APP从SQS调查。我不喜欢这个选项,因为它在APP和AWS之间产生了太多的网络流量。
  2. SNS向两者发送通知:APP和SQS。如果APP能够接收消息,它将立即从SQS中删除它。如果APP无法接收消息(崩溃),它可以在启动时从SQS加载消息并清理队列。
  3. AWS Lambda代码作为消息传递服务。如果Lambda代码失败,它可以将消息推送到SQS死信队列,否则保持队列清洁。处理Lamba代码更新的开销太大,如果可能的话,使用纯AWS解决这个问题会很酷。
  4. 完美的解决方案是为SNS消息设置无限超时,但看起来亚马逊不支持它。

    您认为解决此问题的最佳解决方案是什么?我错过了什么吗?

2 个答案:

答案 0 :(得分:5)

一种选择可能是让SNS将消息传递给调用您应用的Lambda。如果Lambda无法将消息传递到您的应用程序,则会失败,以便SNS将重试Lambda。然后,您可以使用死信队列(SQS)配置Lambda,以便在失败次数过多时,消息将进入队列。最后,您可以按计划运行另一个Lambda,该计划检查死信队列并重试Lambda调用。如果失败,它会继续将消息放回到死信队列中。

这样,如果您的应用可用,则会立即发送消息。如果该应用程序不可用,那么它将在稍后重试交付。

答案 1 :(得分:0)

我相信对您来说最简单的解决方案是为SNS订阅设置一个SNS死信队列,该队列将消息传递到App。详细信息:

https://aws.amazon.com/blogs/compute/designing-durable-serverless-apps-with-dlqs-for-amazon-sns-amazon-sqs-aws-lambda/