【发布时间】:2021-01-13 19:26:43
【问题描述】:
我有一个 lambda 函数,它接受一个参数,即 category_id,从 API 中提取一些数据,并根据响应更新数据库。
我必须每天间隔 1 分钟后为多个 ID 执行相同的 lambda 函数。
例如,在凌晨 12:00 为类别 1 运行 lambda,然后在凌晨 12:01 为类别 2 运行,然后为 500 多个类别运行一次。
实现这一目标的最佳解决方案是什么?
这是我目前的想法:
- 使用 AWS SAM 编写 Lambda
- 为共享依赖项添加 Lambda 层
- 将 Lambda 附加到 AWS Cloudwatch Events 以按计划运行
- 为 lambda 中的 category_id 添加环境变量
- 更新 SAM 模板以一次又一次地使用相同的 lambda 函数,但只会在 Cron 表达式计划和环境变量 category_id 的值中发生变化
上述解决方案中的问题:
- 账户中的 Lambda 函数数量将增加。
- 每个 Lambda 都将附加一个 Cloudwatch 事件,因此其数量也会增加
- 每个帐户的配额限制为最多 300 个 Cloudwatch 事件(尽管我们可以请求支持以提高该限制)
- 由于 SAM 模板大小限制以及每个模板的资源数量最多为 200,因此需要使用嵌套堆栈。
- 我将只能为每个嵌套堆栈创建 50 个 Lambda 函数,这意味着嵌套堆栈的数量也会增加,因为 1 lambda = 4 个资源(Lambda + Role + Rule + Event)
其他解决方案(不确定是否可以使用):
- 阶梯函数的使用
- 仅使用 Cron Schedule 触发第一个 Lambda 函数,并使用当前 lambda 为下一个类别调用 Lambda(只需要一个 CloudWatch 事件来调用第一个类别的函数,但时间差会有所不同,即下一个 lambda 将不会恰好在之后执行一分钟)。
- 仅使用一个 Lambda 和一个 Cloud Watch 调度事件,Lambda 函数将具有所有类别 ID 的列表,并且该函数将通过一次使用一个类别 ID 并从列表中删除使用类别 ID 来递归调用自身(唯一的问题是,对于列表中的下一个 category_id,lambda 不会在一分钟后准确执行)
期待听到最佳解决方案。
【问题讨论】:
-
它是每分钟调用一次相同的Lambda函数(使用不同的参数),还是需要调用不同的Lambda函数每次?
-
为什么需要每分钟调用一次?如果 Lambda 函数的执行时间超过一分钟怎么办?或者,如果运行一个函数只需要 30 秒,是否可以立即启动下一个类别,而不必等待下一分钟? Lambda 函数中是否有任何限制或瓶颈阻止它们同时运行(例如,所有函数都试图使用同一个数据库)?
-
相同的 lambda 具有相同的实现逻辑,只是每次自动执行时的参数不同。
-
One Lambda 函数的执行时间不到 30 秒,因为第三方 API 不允许连续 API 调用并阻止请求,因此需要每分钟调用一次。所以要延迟下一个 API 调用,它需要延迟执行,显然,我们不能在同一个 lambda 中添加 sleep 语句,因为 lambda 中的 sleep 语句仍然需要执行时间,而且 lambda 超时限制不允许太多类别。
-
@JohnRotenstein 拥有 500 多个具有不同静态输入的预定事件会很好吗?
标签: amazon-web-services aws-lambda aws-serverless aws-sam