延迟调用 Lambda 函数

延迟调用 Lambda 函数

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

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

目前,每天会收到几个请求,因此实例将停止,直到收到请求. 当请求到来时,Lambda 函数启动实例但第一个请求丢失了如果实例正在运行,则转发请求。

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

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

2)使用亚马逊 SQS存储所有请求。然后切换 Express API,让工作人员检查 SQS 是否有新消息。我不喜欢这种解决方案,因为我将一直检查 SQS,而大多数时候 SQS 都是空的,我想这可能会很昂贵。

3)重新调用拉姆达延迟执行函数。当实例准备就绪时,只需在 1 分钟内(例如)使用相同请求再次调用 Lambda 函数即可。在我看来,这是目前最好的解决方案,简单有效,但我不知道如何实现它。我知道您可以安排 Lambda 执行,但有“每天下午 3 点执行此函数”之类的内容,我只想延迟执行一次该函数。

我被这个问题困扰了,希望有人能澄清我的想法。

答案1

使用 SQS 解决方案。

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

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

在您的 EC2 实例上,轮询 SQS 队列以查找工作。您可以通过最小化请求来最大程度地降低 SQS 成本:

  • 使用长轮询,和/或
  • 每分钟检查一次队列,检查之间休息一下。

SQS 请求并不昂贵。每分钟轮询一次每月将产生 43,200 个请求。这远低于您每月免费获得的 100 万个请求。即使免费套餐未涵盖,前 100 万个请求也只需 0.50 美元。

相关内容