Answers:
我所做的一件事是在ApproximateNumberOfMessagesVisible
(>= 1 for 5 minutes
)上为SQS队列创建CloudWatch警报。警报发布到触发Lambda函数的SNS主题。lambda函数一直循环直到清除队列。
触发警报最多可能需要5分钟,但是它对于批量计划任务非常有效,而无需轮询队列。(活动队列的警报粒度为5分钟。)
你不能去SQS -> SNS
,只SNS -> SQS
。
Lambda 现在支持调度,因此一种选择是在Lambda函数中实现SQS轮询器并频繁运行。
要考虑的另一种选择是您是否实际上需要队列。Lambda支持异步处理(通过事件调用模式),并且应透明地水平缩放以处理并行调用。如果您的lambda函数不需要访问可能限制并行执行的中央状态存储,则您可以仅并行运行所有调用。我相信每个帐户有100个并发执行限制,因此您可能需要分批发送消息以保持该限制。
不久前有人问过并回答了这个问题,但我本人对此进行了思考,所以我想添加一种方法。
如前所述,事件来源可能是最好的选择。另外,我也没有测试过,也没有考虑到这一点(因此这是一种学术上的尝试),但是可以通过如下所示的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(...会被丢弃吗?),但这只是考虑解决此问题的另一种方法。= :)