【发布时间】:2022-01-16 20:09:25
【问题描述】:
我的任务是研究基于 AWS Lambda 构建的服务,该服务执行打开和关闭虚拟机的长时间运行任务。请注意,我来自 Azure 团队,所以我不熟悉 AWS 服务的样式或最佳实践。
原始开发人员采用的方法是将整个工作负载发送到一个 Lambda 函数,然后让该函数获取一部分工作负载,然后使用剩余的工作负载递归调用自身,直到所有项目都消失(工作负载 = 0) .
伪代码:
// Assume this gets sent to a HTTP Lambda endpoint as a whole
let workload = [1, 2, 3, 4, 5, 6, 7, 8]
// The Lambda HTTP endpoint
function Lambda(workload) {
if (!workload.length) {
return "No more work!"
}
const toDo = workload.splice(0, 2) // get first two items
doWork(toDo)
// Then... except it builds a new HTTP request with aws sdk
Lambda(workload) // 3, 4, 5, 6, 7, 8, etc.
}
这似乎非常低效且不可靠(如果我错了,请纠正我)。在这个过程中存储了很多状态,我认为这会产生很多故障点。
我的计划是建议我们重新设计整个服务以使用 Queue/Worker 类型的框架,理想情况下,端点一次处理一个工作负载,并且是无状态的。
队列将由一个服务填充(Jenkins?Lambda?手动?),然后第二个服务将从队列中读取(理想情况下也可以根据需要横向扩展)。
【问题讨论】:
-
你是对的,有一个特定的最佳实践。递归实际上是一种不好的做法:docs.aws.amazon.com/lambda/latest/dg/best-practices.html 大多数人倾向于使用 SNS 或 Step Functions 或队列服务 SQS,尽管在 AWS Lambda 中有这种用于多次调用的设计模式,我会尝试思考它的名称。
标签: amazon-web-services aws-lambda