我有一个不断接收消息的SQS队列。我还有正在处理队列的NodeJS Lambda。处理应定期进行,但很少发生,例如每天两次。处理队列的Lambda正在一个批处理队列的内容,重要的是它可以在开始处理时处理队列的完整内容。
从队列中获取单个消息很简单。它是异步操作,我可以将它放在promise中,并在解析promise时处理消息。
现在的问题是如何处理完整队列?我应该循环直到队列为空,但由于操作是异步的,我不知道何时结束循环。我可以看到几个相当难看的解决方案。就像我有一些停止变量,我在异步操作的回调中更新,并在更新时停止循环,但它听起来不像是理想的解决方案。我需要放一些读延迟,这样我就不会用不必要的读操作轰炸队列。
对此有什么可靠的解决方案?
答案 0 :(得分:0)
如果我完全理解您的问题,您的Lambda计划每天运行两次(左右),当它运行时,您希望它处理位于SQS队列中的所有邮件。
您不想等待消息,而是直接使用SQS队列中的现有消息(+您的Lambda不允许运行超过300秒),所以我会去{{3设置WaitTimeSeconds=0
。然后,您可以设置MaxNumberOfMessages=10
(允许的最大值),但由于receiveMessage
在短轮询中仅请求所有SQS主机的子集,因此您无法保证所有消息实际上都位于队列中一次通话(即使少于10次)。
因此,我会编写代码并跟踪receiveMessage
连续调用的次数,根本不返回任何消息。如果来自receiveMessage
的新回调返回任何消息,则重置此计数器并重新开始。一旦数字达到您选择的阈值(您可以根据经验定义,我将从10开始),您的脚本认为队列中实际上没有消息并退出。
您可以使用方便的方法来减轻回调语法,例如receiveMessages
short polling and not long polling。