AWS SQS + SNS + Lambda

AWS SQS + SNS + Lambda

我想知道我是否可以向 SQS 队列发送一条消息并订阅一个 SNS 主题来触发一个 lambda 来发送电子邮件。

SQS -> SNS -> (Lambda) -> SES

我知道 SNS 消息可以发送到 SQS,但我很好奇反过来是否可以

答案1

ApproximateNumberOfMessagesVisible我做的一件事是为 SQS 队列创建( )上的 CloudWatch 警报>= 1 for 5 minutes。警报发布到触发 lambda 函数的 SNS 主题。lambda 函数循环直到清除队列。

从警报触发最多可能需要 5 分钟,但它非常适合批量计划任务,无需轮询队列。(活动队列的警报粒度为 5 分钟。)

答案2

你不能去SQS -> SNS,只是SNS -> SQS

拉姆达现在支持调度因此,一种选择是在 Lambda 函数中实现 SQS 轮询器并频繁运行它。

另一个需要考虑的选项是您是否真的需要队列。Lambda 支持异步处理(通过事件调用模式),并且应该透明地水平扩展以处理并行调用。如果您的 lambda 函数不需要访问可能限制并行执行的中央状态存储,那么您可能只需并行运行所有调用即可。不过,我相信每个帐户的并发执行限制为 100,因此您可能需要批量处理消息以保持在此限制之下。

答案3

SQS队列可以订阅SNS主题,以便处理收到的SNS消息。目前,如果不进行额外编码,则无法在其他方向上实现(例如参见Lambda常问问题)。

我想说的是,有几个选项可以做到这一点,但它不像使用更常见的事件驱动系统那么优雅。否则,您可能需要自定义/实现处理队列的AWS event->SQS->Lambda代码:SQS

  1. 你可以实现你的自己的事件源
  2. 你可以吃一些中间 EC2 实例监听SQS队列,然后触发LambdaSQS 事件

答案4

这个问题之前已经问过并回答过了,但我自己也刚刚想到了这个问题,所以我想添加一种方法。

如上所述,事件源可能是最好的选择。或者,我还没有测试过,也没有仔细考虑过(所以这有点学术性),但可能可以通过 SNS 的扇出模式来实现这一点,如下所示:

 1. Create a SNS topic.............................: SNS-topic-01
 2. Subscribe a SQS queue to that topic............: SQS-queue-01
 3. Subscribe a Lambda Function to that topic......: LAMBDA-func-01

使用此配置,向 SNS 主题提交消息将使其进入 SQS 队列,同时触发配套的 Lambda 函数。该 Lambda 函数将被编写为读取同一个 SQS 队列,但具有长轮询启用(最多 20 秒),以便它不会在入队完成之前读取队列(即竞争条件)。

本质上,此方案会为每个排队的 SQS 消息即时调用一个 Lambda 函数。我不知道同时进行的 Long Poll 读取器如何在 SQS 上工作(... 是否会被丢弃?),但这只是考虑解决这个问题的另一种方法。=:)

相关内容