问题描述
我有一个lambda函数,该函数接受一个参数,即category_id,从API中提取一些数据,并根据响应更新数据库。
每天间隔1分钟后,我必须对多个ID执行相同的lambda函数。
例如,在12:00 AM为类别1运行lambda,然后在12:01 AM为类别2运行,所以对500多个类别运行lambda。
实现这一目标的最佳解决方案是什么?
这是我目前在想的:
- 使用AWS SAM编写Lambda
- 为共享依赖项添加Lambda层
- 将Lambda与AWS Cloudwatch Events关联以按计划运行
- 在lambda中为category_id添加环境变量
- 一次又一次地更新SAM模板以使用相同的lambda函数,但唯一的变化将是Cron表达式时间表和环境变量的值category_id
上述解决方案中的问题:
- 该帐户中的Lambda函数数量将增加。
- 每个Lambda都将附加一个Cloudwatch Event,因此其数量也会增加
- 每个帐户的配额上限为300个Cloudwatch事件(尽管我们可以请求支持以增加该限额)
- 由于SAM模板的大小限制以及每个模板的最大200个资源,因此需要使用嵌套堆栈。
- 每个嵌套堆栈只能创建50个Lambda函数,这意味着嵌套堆栈的数量也会增加,因为1 lambda = 4种资源(Lambda + Role + Rule + Event)
其他解决方案(不确定是否可以使用):
- 步进功能的使用
- 仅使用Cron Schedule触发第一个Lambda函数,并使用当前Lambda调用下一个类别的Lambda(只需要一个CloudWatch Event调用第一个类别的函数,但时差会有所不同,即下一个Lambda将不会在之后精确执行一分钟)。
- 仅使用一个Lambda和一个Cloud Watch Schedule事件,Lambda函数将具有所有类别ID的列表,并且该函数将通过一次使用一个类别ID并从列表中删除使用类别ID来递归调用自身(唯一的问题是,对于列表中的下一个category_id,lambda不会在一分钟后准确执行)
期待听到最好的解决方案。
解决方法
我建议使用标准的Worker模式:
- 创建 Amazon SQS队列
- 配置AWS Lambda函数,以使其在将消息发送到SQS队列时触发运行
- 在午夜触发一个单独的过程(例如另一个Lambda函数),该过程将500条消息发送到SQS队列,每个消息具有不同的类别ID
这将导致执行Amazon SQS功能。如果您只希望Lambda函数之一可以在任何时间运行(没有并行执行),请将函数的并发限制设置为1 ,以便任何时候都只能运行一个。一个功能完成后,Lambda将自动从队列中获取另一条消息并开始执行。函数执行之间几乎没有“浪费时间”。
,鉴于您正在进行大量处理,Amazon EC2实例可能更合适。
如果带宽需求较低(例如,仅是进行API调用),那么T3a.micro(每小时0.0094美元)或什至T3a.nano实例(每小时0.0047美元)都可能非常划算。
在实例上运行的脚本可以处理一个类别,然后大循环休眠30秒。在一分钟内运行500个类别大约需要8个小时。每天不到10分!
工作完成后,实例可以停止或自行终止。参见:Auto-Stop EC2 instances when they finish a task - DEV Community