我有这个模式来接收 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 美元。