在发送到 SNS 之前,我可以使用 Amazon SQS 作为延迟队列吗?

Can I use Amazon SQS as a delay queue before sending to SNS?

我的系统 运行 在 Amazon 自动缩放组上,一项功能允许用户向用户发送消息,我有以下用例需要解决。

  1. 用户之间在我的应用程序中发送了一条新消息。
  2. 通过电子邮件通知用户的消息被放入队列中,延迟 60 秒。此延迟允许实时聊天客户端 (faye/angularjs) 有时间查看消息并将其标记为已查看。
  3. 延迟消息被拾取后,检查 "read" 状态,如果客户端尚未阅读,则发送电子邮件。

最初我打算在每个应用程序服务器上使用 cronjob 轮询消息队列,但我发现使用 SNS 调用某种电子邮件发送端点(可能在 Lambda 中)会更有效。

但是我看不出有任何方法可以让 SNS 轮询 SQS,有人可以建议如何做到这一点吗?本质上,我希望 SNS 有延迟,这样我就不会在 "live" 聊天中用电子邮件提醒向某人发送垃圾邮件。

谢谢

不幸的是,这还不是开箱即用的。缺少的部分是 Amazon SNS notifications on message arrival/visibility by an Amazon SQS queue, be it via push (similar to Amazon S3 notifications, or via poll similar to Amazon Kinesis subscriptions (see The Pull/Push Event Models for more on the difference), which would both allow to directly connect an AWS Lambda function to the resp. SQS delay queue 事件的生成,参见例如:

也就是说,您可以通过几种方式解决此限制,例如:

A​​WS Lambda 团队在最近一个月交付了 many/most 类似的功能请求,顺便说一句,因此我希望他们在一年中仍能提供 SQS 事件处理和计划的 Lambda 函数。

在 2019 年初,可以通过几种不同的方式解决此问题:

由于 SNS 有一个 topic limit of 100,000 per account, I would recommend using Amazon SES 来发送电子邮件(62,000 个免费 emails/month 可以帮助做出实施成本决策)。