我想知道我是否可以向 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
答案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 上工作(... 是否会被丢弃?),但这只是考虑解决这个问题的另一种方法。=:)