AWS SQS + SNS + Lambda


11

我想知道是否可以将消息发送到SQS队列并为其订阅SNS主题以触发lambda发送电子邮件。

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

我知道SNS消息可以发送到SQS,但我很好奇是否有其他可能

Answers:


11

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

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


我正在考虑做同样的事情。您知道每次cloudwatch检查队列时是否要收费吗?并不是说我们真的在谈论这种事情,只是出于好奇。
Brian F Leighty

另外,我假设您所说的警报不断不断地发送警报的SNS吗?您将lambda函数的超时设置为什么?
Brian F Leighty

另一件事。对不起,所有评论。我对“近似”部分有些担心,您是否曾经有一段时间没有等待消息等待,因为它认为那里只有0个项目而不是1个项目?
Brian F Leighty

@BrianFLeighty支票是免费的。但是,它不会持续发出警报。对于队列中的消息,可能需要第二个警报(在lambda执行完成和下一个警报之间添加)。轮询可能是更好的解决方案。我的工作通常是一个非常安静的队列(因此​​不值得投票。)
squidpickles

错过了“大约”的评论。似乎工作正常,但ymmv
有点点点的变化

7

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

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

要考虑的另一种选择是您是否实际上需要队列。Lambda支持异步处理(通过事件调用模式),并且应透明地水平缩放以处理并行调用。如果您的lambda函数不需要访问可能限制并行执行的中央状态存储,则您可以仅并行运行所有调用。我相信每个帐户有100个并发执行限制,因此您可能需要分批发送消息以保持该限制。


3
在lambda上使用传统的队列轮询器技巧也没有错:例如,如果lambda在执行过程中使一条消息出队,然后在最后重新触发该函数;否则,让它按计划执行下一次
nik.shornikov '16

1

SQS队列可以订阅SNS主题,以便处理收到的SNS消息。当前,如果没有其他编码,则无法在其他方向使用它(例如,参见LambdaFAQ)。

我要说的是有两种选择方法,但是它并不像使用更常见的事件驱动系统那样优雅AWS event->SQS->Lambda。否则,您可能需要自定义/实现代码如何SQS处理队列:

  1. 您可以实现自己的事件源
  2. 您可以使用一些中间EC2实例来监听SQS队列,然后Lambda在SQS事件上触发

0

不久前有人问过并回答了这个问题,但我本人对此进行了思考,所以我想添加一种方法。

如前所述,事件来源可能是最好的选择。另外,我也没有测试过,也没有考虑到这一点(因此这是一种学术上的尝试),但是可以通过如下所示的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(...会被丢弃吗?),但这只是考虑解决此问题的另一种方法。= :)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.