以延迟方式调用Lambda函数

我有这个模式来接收http请求,并对Windows Server EC2实例下的文件进行一些处理。

API Gateway -> Lambda -> EC2 (Node.js + Express) 

目前,每天都有一些请求, 所以实例在请求到来之前一直停止 。 当发出请求时,Lambda函数启动实例, 但第一个请求丢失 。 如果实例正在运行,则请求被转发。

我想要一个解决scheme,我不会失去第一个请求。 我有几种方法,但似乎没有一个是正确的:

1)将该请求保存到ElastiCache (Redis / memcached)中。 在Express服务器启动时,检查是否有任何保存的请求。

2)使用Amazon SQS来存储所有请求。 然后切换工作人员的Express API以检查SQS是否有新消息。 我不喜欢这个解决scheme,因为我会一直在检查SQS,大部分时间都是空的,我想这可能是昂贵的。

3)延迟重新调用Lambda函数。 在实例准备就绪的情况下,只需在1分钟内(例如)用相同的请求再次调用Lambda函数即可。 我认为这是目前最好的解决scheme,简单而有效,但我不知道如何实现。 我知道你可以安排Lambda的执行,但有一个像“每天下午3点执行这个函数”,而且我只想执行一次函数。

我坚持这一点,希望有人能澄清我的想法。

使用SQS解决scheme。

执行Lambda函数时,将请求存储到SQS中。

在请求添加到队列中时,使用Auto Scaling启动和终止您的EC2实例。

在您的EC2实例上,轮询SQS队列以进行工作。 您可以通过最小化请求来最小化SQS成本:

  • 使用长轮询,和/或
  • 每分钟检查一次队列,在两次检查之间rest。

SQS要求并不昂贵。 每分钟轮询一次会产生每月4300个请求。 这远低于你每个月免费获得的100万个请求。 即使没有免费套餐,第一百万的请求也只有0.50美元。