【发布时间】:2021-01-08 04:23:51
【问题描述】:
我在 AWS 上运行一个需要很长时间才能执行的 lambda 函数(大数据)。 它超过了 lambda 中允许的最大 900 秒(15 分钟),因此函数超时。
使用 context.getRemainingTimeInMillis(),我想在超时之前触发一个新的 lambda 实例。但是,似乎没有办法停止 lambda 的执行,一旦它启动,这意味着如果我犯了任何错误,我们可以进入无限循环并且 lambda 将永远运行? 无论如何,为了避免这种情况,我正在考虑设置一个名为“stopExecution”的环境变量,默认为false,但如果由于某种原因我需要停止执行,请将其设置为true。
基本上在我的 nodejs 代码中,我读取了变量 process.env.stopExecution。现在,我的问题是,lambda 中的环境变量是动态的吗?如果我在执行期间更改值,lambda 将读取新值并因此停止?还是只在函数启动时读取环境变量,在执行过程中保持相同的值,所以读取新值的唯一方法是等待它们停止并再次启动?
另外,如果有人遇到和我一样的问题并想提出更好的解决方案,请随意。
【问题讨论】:
-
不,显然它们不是动态的。任何其他 lambda 实例都不会看到更改的 env 变量。在一次执行中,您可以更改 env 变量,但您不应该这样做,如果您真的需要,只需使用“普通”全局变量即可。但只需使用 EC2 / ECS 而不是将任务硬塞到 lambda 中。如果某件事的时间超过 15 分钟(或接近 15 分钟),则 lambda 不适合。
-
如果您遇到超时并想要调用不同的 lambda,为什么不重构应用程序并使用 Step Functions (aws.amazon.com/step-functions/…)?
-
我同意@OleksiiDonoha 的观点,AWS Step Functions 是通过将处理分成多个 lambda 执行来处理长时间运行的任务的合适机制。
-
因此,使用 Step 函数,我们将触发一个 lambda,获取 executionId,然后在另一个步骤中,定期检查 lambda 是否完成(通过它的 executionId),并在此重新启动一个新实例案子?你所建议的逻辑越来越少了吗?
-
@fgonzalez lambda 应该处理一个“批处理”工作,您可以微调批处理的大小以获得合理的单个 lambda 执行时间。您可以使用“光标”指定上次执行停止处理的位置。信息可以从 lambda 返回,也可以存储在外部存储中。 Lambda 响应可以包含信息是否已完成处理,或者是否需要从“光标”点继续处理。 Step Function 状态机然后可以决定是终止状态机,还是再次调用 lambda 以继续处理。
标签: node.js amazon-web-services aws-lambda