AWS Lambda + SQS,立即处理整个队列

问题描述 投票:0回答:1

我有一个不断接收消息的SQS队列。我还有正在处理队列的NodeJS Lambda。处理应定期进行,但很少发生,例如每天两次。正在处理队列的Lambda正在一个批处理队列的内容,并且在开始处理时它可以处理队列的完整内容是很重要的。

从队列中获取单个消息很简单。它是异步操作,我可以将它放在promise中并在promise解决时处理消息。

现在的问题是如何处理完整队列?我应该循环直到队列为空,但由于操作是异步的,我不知道何时结束循环。我可以看到几个相当难看的解决方案。就像我有一些停止变量,我在异步操作的回调中更新,并在更新时停止循环,但它听起来不像是理想的解决方案。我需要放一些读延迟,这样我就不会用不必要的读操作轰炸队列。

什么是坚实的解决方案?

node.js amazon-web-services aws-lambda amazon-sqs
1个回答
0
投票

如果我理解你的问题,你的Lambda计划每天运行两次(左右),当它运行时,你希望它处理位于SQS队列中的所有消息。

您不想等待消息,而是直接使用SQS队列中的现有消息(+您的Lambda不允许运行超过300秒),所以我会选择short polling and not long polling,设置WaitTimeSeconds=0。然后,您可以设置MaxNumberOfMessages=10(允许的最大值),但由于短轮询中的receiveMessage仅请求所有SQS主机的子集,因此您不能保证只需一次调用即可将所有消息实际放入队列中(即使小于10) 。

因此,我会编写代码并记录对receiveMessage的连续调用次数,根本不返回任何消息。如果来自receiveMessage的新回调返回任何消息,则重置此计数器并重新开始。一旦数字达到您选择的阈值(您可以根据经验定义,我将从10开始),您的脚本会认为队列中实际上没有消息并退出。

您可以使用方便的方法来减轻回调语法,例如receiveMessages here

© www.soinside.com 2019 - 2024. All rights reserved.